私のファイルには次の内容があります。名前の下にIPアドレスを印刷したいです。
Server: 17.128.100.12
Address: 17.128.100.12#53
Name: Testserver1
Address: 17.146.118.156
Server: 17.128.100.12
Address: 17.128.100.12#53
Name: Testserver2
Address: 17.146.118.168
Server: 17.128.100.12
Address: 17.128.100.12#53
Name: Testserver3
Address: 17.146.118.166
出力は次のようになります。
17.146.118.156
17.146.118.168
17.146.118.166
答え1
grep ^Address my_file | grep -v "#" | awk '{print $2}'
答え2
次のように使用できますawk
。
awk 'BEGIN {firstName=0;} /Name/ {firstName=1;} /Address/ {if(firstName) {print $NF}; firstName=0;}' <file>
答え3
perl -0777 -e 'print join "\n", <> =~ m/Name.*?Address:\s*([\d.]+)/gms;'
複数行の正規表現を使用して、名前の直前にある「アドレス:」の後の「数字と点」を一致させます(.*?
欲張りではありません)。
読み取るマジックファイルハンドル<>
- STDINまたは指定されたファイルを読み込みます。
perl -0777 -e 'print join "\n", <> =~ m/Name.*?Address:\s*([\d.]+)/gms;' somefile
または、レコード区切り文字を「name」に設定します。
perl -lne '$/="Name:"; /Address: ([\d\.]+)/ && print $1'
欠落しているため、g
各「レコード」の最初の時間だけが一致します。