
私はLinuxの世界に陥り、職場でLinuxをますます使用していますgrep
。そうすることで、時にはそれが私の要件に十分ではないことがわかりました。
grep
数日前に苦労していましたが、上級Linux管理者の一人が私にawk
。
だから私の質問は、いつ他のものよりも1つを使用することを選択しますか?仕事を始めてgrep
、私ができることと時間を節約できた多くの時間を過ごす前に、自分にどんな質問をすることができますかawk
?
答え1
sed
そしてawk
親セットなので、grep
いくつかのタスクはどちらかを使用する方が簡単です。
grep foo
sed '/foo/!d'
これはまたはで書くことができますが、awk /foo/
次の点を考慮してください。
grep -i foo
sed '/[fF][oO][oO]/!d'
GNUのようなものを考慮したくない場合は:sed '/foo/I!d'
を使用するか、もう一度GNU拡張子を使用してください。awk
awk 'tolower($0) ~ /foo/'
awk -v IGNORECASE=1 /foo/
さまざまなツールがうまくいっているものと他のツールが困難になること:
grep
grep
シンプルなツールですが、使用awk
や再現が難しい非常に特殊な動作モードを持っていますsed
。
grep -i
大文字と小文字を区別しない一致(上記参照)grep -Fe "$string"
固定文字列検索に使用されます(export string; awk 'index($0, ENVIRON["string"])'
ANDawk
、ANDと直接同等のものはありませんsed
)。- (非標準)
grep -r
再帰検索用 - (非標準)
grep -P
/pcregrep
Perlに似た正規表現の場合(一部のsed
実装ではPerlに似た正規表現をサポートしていますが、デフォルトではサポートしていません) - (非標準)
grep -o
一致する部分を返します(複数行awk
またはsed
同じ操作を実行します)。 - (非標準) 一致のコンテキストを返します。 (やはり使いにくい
grep -A/B/C
か似たような方法です)sed
awk
sed
s/foo/bar/
:sed
さんのコマンドには、次のようにs
実装するのが難しい機能があります。awk
s/foo\(.*\)bar/\1/g
:capture(GNU awkには拡張機能がありますがgensub()
)s/foo/bar/3
:各行の3番目の項目を置き換えます。- (非標準):内部ファイルの編集(GNUは
awk
これをサポートしていますが)。
アッ
awk
3つの中で最も機能が豊富なものです。
- 数値処理に適しています
- 列形式の入力を処理するのに適しています。
- 連想配列は、さまざまなソースからデータを抽出して結合するのに適しています。
真珠
perl
実用的な抽出および報告ツールとして、これらすべてのツールの中で最高の機能を備えています。これはもともと意図されています(sed
これはすべてを役に立たないようにするツールですawk
)。
テキスト処理をマスターするにはperl
大きな利点があります。あまり一般的でないコマンドを調べる前に、時間をかけて調べることをお勧めしますsed
。
パフォーマンス
経験上、ツールがより専門的になるほど、作業を効率的に完了できます。ただし、これは実装、タスク、およびその他の要因によって大きく異なり、パフォーマンスの矛盾がある可能性があります。
grep
たとえば、いくつかの非常に高速な実装がありますが、sed
マルチバイト文字をサポートしていないため、マルチバイトロケールの米国英語テキストでのみ機能します。あるいは、小さな固定長バッファで動作するので、任意の入力では動作しないので高速です。