【问题标题】:Piping echo, tail and sed leads to wrong output管道 echo、tail 和 sed 导致错误输出
【发布时间】:2017-08-21 14:32:41
【问题描述】:

我想在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

管道出了什么问题?

【问题讨论】:

    标签: bash sed echo tail piping


    【解决方案1】:

    您的第一行已关闭。您正在将echo -n 传递给tailecho -n 不产生任何输出,所以你没有任何东西可以拖尾。

    您可以改为使用echo -n 附加tail | sed 命令的输出:

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

    tail | sed 位包装到$() 允许echo 获取这些命令的标准输出并将结果(不需要换行)回显到fstab。

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

    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"
    

    【讨论】:

      【解决方案2】:

      以下内容也可能对您有所帮助。

      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
      

      【讨论】:

        猜你喜欢
        • 2016-11-10
        • 2017-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多