Bash如何将单词追加到一行?

时间:2013-02-12 15:31:37

标签: bash unix sed awk grep

我在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循环中,它将不会传递整行,因为它们包含空格。那我该怎么做呢?

6 个答案:

答案 0 :(得分:18)

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

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')

答案 1 :(得分:8)

如何使用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

答案 2 :(得分:2)

您只需要:

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,除非您有非特定原因不这样做。谷歌为什么。

答案 3 :(得分:0)

:INPUT ACCEPT [30:5876]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [25:5616]

...

答案 4 :(得分:0)

我是来这里寻找相同答案的,但是以上这些都做不到

sed -i 's/address=.*/& eth0/g' file

搜索并用sed内联替换以地址开头的行,用同一行加'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

答案 5 :(得分:-1)

这对你好吗?

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你可以将你的cut,tr(在你的例子中甚至是grep)合并到一个sed / awk调用中,以使cmdline更简单,更快。