【问题标题】:Bash how to append word to end of a line?Bash如何将单词附加到行尾?
【发布时间】:2013-01-27 23:04:51
【问题描述】:

我在 bash 中执行了一个命令来从这样的文件中检索一些地址:

grep address file.txt | cut -d'=' -f2 | tr ':' ' '

产量:

xxx.xx.xx.xxx port1
xxx.xx.xx.xxx port2

并且我想将“eth0”附加到每个输出行,然后理想情况下循环遍历结果以在每一行调用一个命令。我遇到的问题是在每一行的末尾获得额外的字符串。我试过了:

| sed -e 's/\(.+)\n/\1 eth0/g'

这不起作用..然后假设我得到了它,如果我将它包装在一个 for 循环中,它不会传递完整的行,因为它们包含空格。那我该怎么办呢?

【问题讨论】:

  • 输入文件是什么样的?

标签: bash unix sed awk grep


【解决方案1】:

我来这里是为了寻找相同的答案,但上面没有一个像

那样干净
sed -i 's/address=.*/& eth0/g' file

用 sed 搜索并替换 inline 以查找以 address 开头的行,替换为同一行加上 'eth0'

例如。

sed -i 's/address=.*/& eth0/g' file; cat file
junk line
address=192.168.0.12:80 eth0
address=127.0.0.1:25 eth0
don not match this line

【讨论】:

  • 我看到这并没有按照指示每行调用任何内容,但这回答了标题问题。
  • 这里做什么和做什么?
  • 它基本上是从 LHS 到替换 RHS 的所有内容的简写。再看一下这个例子或自己尝试一下。 =) 非常适合挂起前/后挂起。
【解决方案2】:
typeset TMP_FILE=$( mktemp )
touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/stringToAdd/' "${TMP_FILE}" > filename

【讨论】:

    【解决方案3】:

    你只需要:

    awk -F'[=:]' '{print $2, $3, "eth0"}' file.txt |
    while IFS= read -r ip port eth
    do
       printf "ip=%s, port=%s, eth=%s\n" "$ip" "$port" "$eth"
    done
    

    在使用 read 时始终使用 IFS= 和 -r,除非您有非常具体的理由不这样做。谷歌为什么。

    【讨论】:

      【解决方案4】:

      使用awk怎么样:

      awk -F= '/address/{gsub(/:/," ");print $2,"eth0"}' file
      

      演示:

      $ cat file
      junk line
      address=192.168.0.12:80
      address=127.0.0.1:25
      don not match this line
      
      $ awk -F= '/address/{gsub(/:/," ");print $2,"eth0"}' file
      192.168.0.12 80 eth0
      127.0.0.1 25 eth0
      

      或者只是sed:

      $ sed -n '/address/{s/:/ /g;s/.*=//;s/$/ eth0/p}' file
      192.168.0.12 80 eth0
      127.0.0.1 80 eth0
      

      【讨论】:

        【解决方案5】:

        您可以匹配$ 以附加到一行,例如:

        sed -e 's/$/ eth0/'
        

        编辑:

        要遍历这些行,我建议使用while 循环,例如:

        while read line
        do
          # Do your thing with $line
        done < <(grep address file.txt | cut -d'=' -f2 | tr ':' ' ' | sed -e 's/$/ eth0')
        

        【讨论】:

        • 酷,最后我如何循环结果?间距使我循环遍历每个单词而不是每一行!
        • Bashgrepcuttrsed 不不不......你想要的可以单独使用 sedawk 来实现。
        • @sudo_O 虽然我在一定程度上分享了你的观点,但这真的不是那么糟糕:P。将大量像这样的小型实用程序链接在一起是 unix 血统,这就是它们存在的原因。
        • 太棒了,我总是忘记&lt;( 的东西,并且在做$(
        • @FatalError UNIX 并不是要在一个小型实用程序完成这项工作时将大量小型实用程序链接在一起。
        【解决方案6】:

        这适合你吗?

        kent$ echo "xxx.xx.xx.xxx port1
        xxx.xx.xx.xxx port2"|sed 's/.*/& eth0/'
        xxx.xx.xx.xxx port1 eth0
        xxx.xx.xx.xxx port2 eth0
        

        P.S 您可以将您的剪切、tr(甚至在您的示例中为 grep)合并到一个 sed/awk 调用中,以使 cmdline 更简单、更快。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-23
          • 1970-01-01
          • 2015-05-12
          • 2016-09-10
          • 1970-01-01
          • 1970-01-01
          • 2012-03-25
          • 2016-07-20
          相关资源
          最近更新 更多