
sed -n "/regexp/p"
一致する行だけが印刷され、regexp
他の行は印刷されません。これは行われた操作と正確に一致しているようですgrep
。この構成を使用して私が見た唯一のユースケースは、すでにgrep
sed内で何かをしていて、他のプログラムにパイプするのが厄介な場合です。
誰もがこの構造を使用する他の理由を考えることができますかgrep
?
答え1
コマンドsed -n '/re/p'
(または各ループの終わりでデフォルト出力を抑制sed '/re/!d'
しない)は、同じで、両方ともこの基本的な方法でエディタのコマンド(「グローバルマッチングと印刷」)で追跡できます。存在するように。-n
grep -e 're'
ed
g/re/p
re
sed
grep
g
ed
特定の正規表現に一致する行のみを印刷するには、grep
を使用しますgrep
。これが最も基本的な作業です。この操作にgrep
代わって使用すると、sed
シェルコードがよりきれいになり、理解と保守が容易になります。
長い編集スクリプトの一部である場合は、/re/p
inを使用してください。非常に特別で気まぐれな要件がない限り、入力をパイプで接続したり、その逆にパイプしないでください。sed
sed
grep
sed
コマンド/re/
は次のとおりです。sed
住所。特定の正規表現に一致するすべての行を処理します。を使用すると、/re/p
次の行が印刷されます。つまり、/re/
コマンドのアドレスですp
。
アドレスは行番号であってもよいし、2行番号、2つの正規表現、またはそれらの組合せによって記述される範囲であってもよい。たとえば、を使用して、sed -n '5,/re/p'
5行目から一致する行まですべての行を印刷できますre
。ユーティリティgrep
にはこの機能はなく、エディタsed
からed
継承されます。
簡単に言えば、grep
特定の正規表現に一致する行を抽出するのに適したツールです。より複雑な基準(範囲内など)に一致する行を抽出するには、sed
またはを使用しますawk
。
答え2
サイズに注意してください:
$ ls -lh /bin/grep /bin/sed
-rwxr-xr-x 1 root root 207K Apr 29 2016 /bin/grep
-rwxr-xr-x 1 root root 72K Feb 11 2016 /bin/sed
$
grep
以下より多くのメモリを使用しました。sed
実行時間(実際):
$ time date | grep Apr
Fri Apr 17 13:31:11 PDT 2020
real 0m0.035s
user 0m0.000s
sys 0m0.016s
$ time date | sed -n '/Apr/p'
Fri Apr 17 13:31:29 PDT 2020
real 0m0.028s
user 0m0.000s
sys 0m0.016s
$
sed
少し速くなったのか見てみましょうか?
これは、リソースが制限されている組み込み環境では重要です。