管道回声,尾部和sed会导致输出错误

时间:2017-08-21 14:32:41

标签: bash sed echo tail piping

我想在fstab中添加一个条目,我在/bin/bash脚本中使用此命令:

echo -n | tail -1 /mnt/etc/fstab | sed 's/\(-\).*/-03/' >> /mnt/etc/fstab
echo -e -n "\t" >> /mnt/etc/fstab  
echo -n "/home" >> /mnt/etc/fstab
echo -e -n "\t" >> /mnt/etc/fstab  
echo -n "ext4" >> /mnt/etc/fstab
echo -e -n "\t" >> /mnt/etc/fstab  
echo -n "default,noatime" >> /mnt/etc/fstab 
echo -e -n "\t" >> /mnt/etc/fstab  
echo -n "0" >> /mnt/etc/fstab 
echo -e -n "\t" >> /mnt/etc/fstab  
echo "2" >> /mnt/etc/fstab 

这是原始内容:

proc                  /proc           proc    defaults          0       0
PARTUUID=ee397c53-01  /boot           vfat    defaults          0       2
PARTUUID=ee397c53-02  /               ext4    defaults,noatime  0       1

这是预期的输出:

proc                  /proc           proc    defaults          0       0
PARTUUID=ee397c53-01  /boot           vfat    defaults          0       2
PARTUUID=ee397c53-02  /               ext4    defaults,noatime  0       1
PARTUUID=ee397c53-03  /home           ext4    defaults,noatime  0       2

而是输出如下:

proc                  /proc           proc    defaults          0       0
PARTUUID=ee397c53-01  /boot           vfat    defaults          0       2
PARTUUID=ee397c53-02  /               ext4    defaults,noatime  0       1
PARTUUID=ee397c53-03
    /home   ext4    default,noatime 0   2

管道有什么问题?

2 个答案:

答案 0 :(得分:2)

你的第一行已关闭。您将echo -ntail联系起来。 echo -n没有产生任何输出,所以你没有任何东西可以拖尾。

您可以使用tail | sed替代echo -n命令的输出:

echo -n $(tail -1 /mnt/etc/fstab | sed 's/\(-\).*/-03/') >> /mnt/etc/fstab

tail | sed位包装到$()允许echo接收这些命令的标准输出并将结果(根据需要没有换行)回显到fstab。

或者,您可以使用xargs来管道回显,以便它可以从标准输入读取。

tail -1 /mnt/etc/fstab | sed 's/\(-\).*/-03/' | xargs echo -n >> /mnt/etc/fstab

此外,您可以使用printf来完成整个脚本:

printf "%s\t%s\t%s\t%s\t%s\t%s\n", $(tail -1 /etc/fstab | sed 's/\(-\).*/-03/') "/home" "ext4" "default,noatime" "0" "2"

答案 1 :(得分:1)

以下也可以帮助你。

awk -F'[- ]' 'END{val=sprintf("%02d",$2+1);print $1"-"val," /home           ext4    defaults,noatime  0       2"}'   Input_file

如果您对上面的awk结果感到满意,那么您也可以使用以下命令保存结果。

awk -F'[- ]' '1;END{val=sprintf("%02d",$2+1);print $1"-"val," /home           ext4    defaults,noatime  0       2"}' Input_file  > tmp && mv tmp Input_file
相关问题