カットして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の間にも違いはありません)。 これは、スクリプト内のループ内の多くの呼び出しについてです。 サイクル内のすべての例を、数百(できれば数千)の呼び出しと比較します。

Source: https://habr.com/ru/post/J104546/


All Articles