たとえば、ファイルがある場合:
potato: 1234
apple: 5678
potato: 5432
grape: 4567
banana: 5432
sushi: 56789
で始まるすべての行をgrepしたいpotato:のですが、後に続く番号のみをパイプしますpotato:。したがって、上記の例では、出力は次のようになります。
1234
5432
どうやってやるの?
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:( &&) を行い、次に上記の正規表現の適用に進み、結果を出力します)。
または、正規表現アサーションを使用します。grep -oP '(?<=potato: ).*' file.txt
sed -n 's/^potato:[[:space:]]*//p' file.txt
Grep は制限された Sed と考えることができ、Sed は一般化された Grep と考えることができます。この場合、Sed は、必要な機能を備えた優れた軽量ツールの 1 つですが、もちろん、それを行うための合理的な方法が他にもいくつかあります。
これにより、一致するたびにすべてが同じ行にのみ出力されます。
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 コードを実行する