12

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

4

6 回答 6

23

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

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')
于 2013-02-12T15:34:40.957 回答
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
于 2013-02-12T15:34:33.417 回答
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 ,除非您有非常具体的理由不这样做。谷歌为什么。

于 2013-02-12T16:20:44.063 回答
2

我来这里是为了寻找相同的答案,但以上都不像

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
于 2019-05-07T15:21:17.240 回答
0
typeset TMP_FILE=$( mktemp )
touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/stringToAdd/' "${TMP_FILE}" > filename
于 2017-02-07T21:07:27.220 回答
-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

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

于 2013-02-12T15:33:45.740 回答