
以下のファイルがあります。 info2の右の値を返したいです。第二に、同じ方法でinfo5の値を返したいと思います。
文書:
info1 218, info2 111, info3 415, info5 done,
答え1
そしてawk
:
$ awk 'BEGIN { RS="," } $1 ~ /info[25]$/ { print $2 }' input
111
done
入力レコード区切り文字(RS
)をカンマに設定し、最初のフィールドにinfo
2または5が含まれ、その後に何もないすべてのレコードに対して2番目のフィールドを印刷します。
答え2
少し改善ジョロバの答え:
sed -n 's/.*info2 \([^,]*\).*/\1/p' file
-n
「特に指示がない限り何も印刷しないでください」を意味します。これは!d
、一致しない行を削除(無視)するために chorobを使用するのと同じですinfo2
。- このコマンドの内容は、カンマ(数字だけでなく)を除くすべての文字のシーケンスをキャプチャしてから
done
抽出できることを除いて、 chorobの内容と非常によく似ていますinfo5 done,
。 - コマンドは
p
(print) で終わります。そうしないと、 を使用しても-n
何も印刷されないからです。
これの利点は、ラベルを2回指定する必要がないことです。 (行に背中が含まれていると、望ましくない結果は生成されません)infoN
info20
info21
答え3
2段階ソリューション:
tr ',' '\n' <file | sed -n 's/^ *info[25] *//p'
tr
サンプルテキストを次に変換
info1 218
info2 111
info3 415
info5 done
そして、スクリプトsed
は文字列(および周囲のスペース)を削除し、目的のテキストを残します。他の行は削除されます。info2
info5
結果:
111
done
awk
たとえば、完了するのに最適です。DopeGhotiのソリューション。
awk
私のアプローチによる変形tr
:
tr ',' '\n' <file | awk '/info[25]/ { print $2 }'
答え4
sed を使用できます:
sed '/info2 [0-9]/!d;s/.*info2 \([0-9]*\).*/\1/' file
/info2/
は「アドレス」であり、そのアドレスを含むすべての行はinfo2
そのアドレスと一致すると見なされます。!d
「アドレスの外側の行の削除」を意味するため、含まれている行のみがinfo2
次のコマンドで処理されます。- 置換はキャプチャグループを使用して、次の数字を記憶し、行全体
info2
(前のものinfo2
、info2
それ自体、数字、数字の後ろのすべて)を数字に置き換えます。
後に「done」をキャプチャする必要がある場合はinfo5
使用できませんが、カンマではなく置き換える[0-9]*
ことができます。[^,]*