2017-08-21 46 views
0

我想在fstab添加一个条目,我在我的/bin/bash脚本中使用这个命令:管道呼应,尾部和SED导致错误输出

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

您的第一条线已关闭。您正在管道echo -ntailecho -n不会产生任何输出,所以你没有任何管道连接到尾部。

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

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

中包装tail | sed位为$()允许回声采取这些命令的stdout和回声出结果(不换行作为希望)回到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

也继可以帮助你在相同的。

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