105

たとえば、ファイルがある場合:

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

で始まるすべての行をgrepしたいpotato:のですが、後に続く番号のみをパイプしますpotato:。したがって、上記の例では、出力は次のようになります。

1234
5432

どうやってやるの?

4

8 に答える 8

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

grep文字列 を含む任意の行を検索しpotato:、これらの行のそれぞれについて、行の先頭 ( ) から最後のシーケンス(コロンの後にスペースが続く) までの任意の文字 ( ) を空の文字列にsed置き換えます ( s///- 置換します)。文字列 ( - 最初の部分を空の 2 番目の部分に置き換えます)。.*^:s/...//

また

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) Perlスクリプトに送信されstdin、次に、これらの行のそれぞれについて、上記の最初の例と同じ置換を行い、それを出力します。

また

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

ファイルは ( を介して左側のコマンドを介してファイルの内容を送信する) を介してstdin送信され、(正規表現が現在の行と一致する場合は true を返す) を含む各行に対して、説明されているように 2 番目のフィールドを出力する< file.txtスクリプトに送信されます。その上。stdinawkpotato:if(/potato:/)/potato:/

また

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

ファイルはstdin( < file.txt、上記を参照) 経由で、上記と同様に機能する Perl スクリプトに送信されますが、今回は、各行に文字列potato:(は現在の行に,/potato:/が含まれている場合に一致する正規表現) が含まれていることも確認します。 potato:( &&) を行い、次に上記の正規表現の適用に進み、結果を出力します)。

于 2012-04-27T22:14:27.987 に答える
72

または、正規表現アサーションを使用します。grep -oP '(?<=potato: ).*' file.txt

于 2012-04-27T22:59:07.293 に答える
13
sed -n 's/^potato:[[:space:]]*//p' file.txt

Grep は制限された Sed と考えることができ、Sed は一般化された Grep と考えることができます。この場合、Sed は、必要な機能を備えた優れた軽量ツールの 1 つですが、もちろん、それを行うための合理的な方法が他にもいくつかあります。

于 2012-04-27T22:15:47.750 に答える
2

これにより、一致するたびにすべてが同じ行にのみ出力されます。

perl -lne 'print $1 if /^potato:\s*(.*)/' file.txt

これは、後続のすべての行も出力することを除いて、同じことを行います。

perl -lne 'if ($found){print} elsif (/^potato:\s*(.*)/){print $1; $found++}' file.txt

次のコマンド ライン オプションが使用されます。

  • -n入力ファイルの各行をループします
  • -l処理前に改行を削除し、後で追加し直します
  • -eperl コードを実行する
于 2016-06-28T17:36:37.073 に答える