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

特別な理由がない限り、読み取りを使用するときは常に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あなたはあなたのcut、tr(あなたの例ではgrepさ​​え)を1つのsed / awk呼び出しにマージして、コマンドラインをより単純でより速くすることができます。

于 2013-02-12T15:33:45.740 に答える