管道 echo、tail 和 sed 会导致错误的输出
Piping echo, tail and sed leads to wrong output
我想在 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
管道有什么问题?
您的第一条线路已关闭。您正在管道 echo -n
到 tail
。 echo -n
不产生任何输出,因此您没有向 tail 传输任何内容。
您可以使用 echo -n
附加 tail | sed
命令的输出:
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"
以下内容也可能对您有所帮助。
awk -F'[- ]' 'END{val=sprintf("%02d",+1);print "-"val," /home ext4 defaults,noatime 0 2"}' Input_file
如果您对以上 awk 的结果满意,那么您也可以使用以下命令保存结果。
awk -F'[- ]' '1;END{val=sprintf("%02d",+1);print "-"val," /home ext4 defaults,noatime 0 2"}' Input_file > tmp && mv tmp Input_file
我想在 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
管道有什么问题?
您的第一条线路已关闭。您正在管道 echo -n
到 tail
。 echo -n
不产生任何输出,因此您没有向 tail 传输任何内容。
您可以使用 echo -n
附加 tail | sed
命令的输出:
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"
以下内容也可能对您有所帮助。
awk -F'[- ]' 'END{val=sprintf("%02d",+1);print "-"val," /home ext4 defaults,noatime 0 2"}' Input_file
如果您对以上 awk 的结果满意,那么您也可以使用以下命令保存结果。
awk -F'[- ]' '1;END{val=sprintf("%02d",+1);print "-"val," /home ext4 defaults,noatime 0 2"}' Input_file > tmp && mv tmp Input_file