たとえば、ファイルがある場合:
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
スクリプトに送信されます。その上。stdin
awk
potato:
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
処理前に改行を削除し、後で追加し直します -e
perl コードを実行する