私は次のようにファイルからいくつかのアドレスを取得するために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ループでラップすると、スペースが含まれているため、行全体に渡されません。では、どうすればよいですか?
$
は、次のように行に追加します。
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')
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
あなたに必要なのは:
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を使用してください。グーグル理由。
typeset TMP_FILE=$( mktemp )
touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/stringToAdd/' "${TMP_FILE}" > filename
これは大丈夫ですか?
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さえ)を1つのsed/awkコールにマージして、cmdlineをよりシンプルでより速くすることができます。
私は同じ答えを求めてここに来ましたが、上記のどれもそれほどきれいではありません
sed -i 's/address=.*/& eth0/g' file
Addressで始まる行をインラインで検索して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