カットしてgrepまたはawk?

多くの場合、スクリプトではfoobar|awk '{print $1}'



ようなものを見つけることができます( "頻繁に"は頻繁にあります )。



このようなawk呼び出しは、前のコマンドの出力の最初の(n番目の)列を終了するだけです。 しかし、これは明らかに過剰です! awkはデータをストリーミングするためのかなり強力な言語であり、単純なフィールド区切り文字として使用するのは良くありません。



指定したフィールドを文字列から切り取るには、cutコマンドを使用することをお勧めします。 彼女はあまり知らないので、使いやすく、速くなります。



現代のLinuxでは、awk呼び出しの処理はcut呼び出しよりもはるかに複雑です。 たとえば、debianでは、awkは/ etc / alternatives / awkへのリンクであり、(ほとんどの場合)gawkにつながります。 これは、カットのほぼ10倍です。 もちろん、負荷をより速くカットします。



cutは、バイトだけでなく、必要なフィールドもカットできます(オプション-f)。 フィールドは、区切り文字間のテキストです。 デフォルトの区切り文字はスペース/タブですが、-dオプションで簡単に変更できます。



2番目のアプローチは、grepの-oオプションを使用することです。 このオプションは、文字列全体を表示するのではなく、grep検索条件にのみ一致します。 正確な部分文字列を検索する場合は明らかに役に立たないが、正規表現を使用する場合は非常に便利です。



例えば

grep -v "#" /etc/inittab |cut -f 4 -d : -s





initによって起動されたプログラムのリストが表示されます(4番目のフィールド、コロンで区切られたフィールド)。



または

grep http://\\S\\+ -o /var/log/apache2/error.log





エラーのあるファイルのURLをリストします(行の最初のURL)。



...そしてawkはありません。



UPD:コメントは、外部ファイルを実行せずにさらに興味深い構成を示唆しています(読み取りコマンドはbashによって実装されます)。

foobar | (read p1 p2; echo p1)







PSそれは単一の呼び出しについてではありません(awk、grep、さらにはpython / perlの間にも違いはありません)。 これは、スクリプト内のループ内の多くの呼び出しについてです。 サイクル内のすべての例を、数百(できれば数千)の呼び出しと比較します。



All Articles