テキストの横に Sed または Grep 番号を使用する方法

テキストの横に Sed または Grep 番号を使用する方法

以下のファイルがあります。 info2の右の値を返したいです。第二に、同じ方法でinfo5の値を返したいと思います。

文書:

info1 218, info2 111, info3 415, info5 done,

答え1

そしてawk

$ awk 'BEGIN { RS="," } $1 ~ /info[25]$/ { print $2 }' input
111
done

入力レコード区切り文字(RS)をカンマに設定し、最初のフィールドにinfo2または5が含まれ、その後に何もないすべてのレコードに対して2番目のフィールドを印刷します。

答え2

少し改善ジョロバの答え:

sed -n 's/.*info2 \([^,]*\).*/\1/p' file
  • -n「特に指示がない限り何も印刷しないでください」を意味します。これは!d 、一致しない行を削除(無視)するために chorobを使用するのと同じですinfo2
  • このコマンドの内容は、カンマ(数字だけでなく)を除くすべての文字のシーケンスをキャプチャしてからdone抽出できることを除いて、 chorobの内容と非常によく似ていますinfo5 done,
  • コマンドはp(print) で終わります。そうしないと、 を使用しても-n何も印刷されないからです。

これの利点は、ラベルを2回指定する必要がないことです。 (行に背中が含まれていると、望ましくない結果は生成されません)infoNinfo20info21

答え3

2段階ソリューション:

tr ',' '\n' <file | sed -n 's/^ *info[25] *//p'

trサンプルテキストを次に変換

info1 218   
 info2 111  
 info3 415  
 info5 done 

そして、スクリプトsedは文字列(および周囲のスペース)を削除し、目的のテキストを残します。他の行は削除されます。info2info5

結果:

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(前のものinfo2info2それ自体、数字、数字の後ろのすべて)を数字に置き換えます。

後に「done」をキャプチャする必要がある場合はinfo5使用できませんが、カンマではなく置き換える[0-9]*ことができます。[^,]*

関連情報