1. ホーム
  2. linux

[解決済み] パターン以降の内容をgrepするには?

2022-11-21 18:37:50

質問

例えば、あるファイルがあるとします。

potato: 1234
apple: 5678
potato: 5432
grape: 4567
banana: 5432
sushi: 56789

で始まるすべての行を grep したい。 potato: で始まるすべての行を grep して、その後に続く数字だけをパイプしたい。 potato: . ですから、上記の例では、出力は次のようになります。

1234
5432

どうすればいいのでしょうか?

どのように解決するのですか?

grep 'potato:' file.txt | sed 's/^.*: //'

grep という文字列を含む行を探します。 potato: という文字列を含む行を探し、その行ごとに sed に置き換わる ( s/// - 置換) 任意の文字 ( .* ) を、行頭から ( ^ ) からシーケンスの最後の出現まで : (コロンの後にスペースが続く) で、空文字列 ( s/...// - は、最初の部分を空白の2番目の部分に置き換えます)。

または

grep 'potato:' file.txt | cut -d\   -f2

を含む各行に対して potato: , cut は、行をスペースで区切られた複数のフィールドに分割します ( -d\ - d = デリミタです。 \ = エスケープされたスペース文字、以下のようなもの -d" " のようなものでも構いません)、そのような行の 2 番目のフィールドを表示します ( -f2 ).

または

grep 'potato:' file.txt | awk '{print $2}'

を含む各行に対して potato: , awk は2番目のフィールドを表示します ( print $2 ) を表示します。これはデフォルトではスペースで区切られています。

または

grep 'potato:' file.txt | perl -e 'for(<>){s/^.*: //;print}'

を含むすべての行は potato: はインライン( -e ) パール からすべての行を取り込むスクリプトです。 stdin からすべての行を取り、これらの行のそれぞれに対して、上記の最初の例と同じ置換を行い、それを表示するスクリプトです。

または

awk '{if(/potato:/) print $2}' < file.txt

ファイルの送信は stdin ( < file.txt でファイルの内容を送信します。 stdin を左のコマンドへ) を使って awk を含む各行に対して potato: ( if(/potato:/) は、正規表現 /potato:/ が現在の行にマッチする場合、真を返します)、上記のように2番目のフィールドを表示します。

または

perl -e 'for(<>){/potato:/ && s/^.*: // && print}' < file.txt

ファイルの送信は stdin ( < file.txt という文字列を含む Perl スクリプトを作成します。 potato: ( /potato:/ は正規表現で、現在の行に potato: を含んでいればマッチし、含んでいれば ( && )であれば,上記の正規表現の適用を進め,その結果を表示します)。