web-dev-qa-db-ja.com

awkとcutとgrepの正確な違いは何ですか?

次の2つの手法を使用して、必要な行の2列目をファイルから取得できることがわかっています。

awk '/Word/ { print $2 }' filename

または

grep Word filename| cut -f 2 -d ' '

私の質問は:

  • 上記の2つのコマンドの違いは何ですか?
  • どちらが最高のパフォーマンスを持っていますか?
  • awkを使用する場合と比べてcutを使用する場合の利点は何ですか?
  • awkcutよりもどのようなオプションを提供しますか?
31
Nidal

2つのライン間の最も顕著な違いは、入力によって異なります。 cutは、-d内の1文字をフィールド区切り文字(デフォルトはTAB)として受け取り、その文字が出現するたびに新しいフィールドが開始されます。ただし、awkはより柔軟です。区切り文字はFS変数にあり、空の文字列(入力文字ごとに個別のフィールドになります)、単一文字、または正規表現を使用できます。単一の空白文字(デフォルト)の特殊なケースは、空白のsequenceで分割することを意味します。また、awkはデフォルトで先頭の空白を抑制します。

比較してください:

$ echo "abc def" | cut -f 2 -d ' '
def
$ echo "abc    def" | cut -f 2 -d ' '

$ echo " abc def" | cut -f 2 -d ' '
abc


$ echo "abc def" | awk '{ print $2 }'
def
$ echo "abc    def" | awk '{ print $2 }'
def
$ echo " abc def" | awk '{ print $2 }'
def

ここで、awkabcdefの間の一連のスペースで分割しますが、cutはすべてのスペースを区切り文字として使用します。

何をとるかは、達成したいことに依存します。それ以外の場合、cutは独自のプログラミング言語を持っているのに対し、awkはより小型で単一目的のツールであるため、より高速になると思います。

37
Dubu

一般的に言えば、ツールがより専門的であるほど、それはより速くなります。したがって、ほとんどの場合、cutおよびgrepsedよりも高速で、sedawkよりも高速であると予想できます。より単純なツールのより長いパイプラインを、より複雑なツールの1回の呼び出しで比較する場合、経験則はありません。これは、大きな入力(たとえば、数百万行)でのみ問題になります。短い入力の場合、違いはありません。

より複雑なツールの利点は、もちろん、より多くのことができることです。

あなたのコマンドは不必要に猫を使います。代わりにリダイレクションを使用してください(特に、速度が心配な場合は、ベンチマークを実行するまで速度を心配する必要はありません¹)。

<fileName awk '/Word/ { print $2 }'
<fileName grep Word | cut -f 2 -d ' '

これらのコマンドはほぼ同等です。違いは次のとおりです。

  • awkとgrepには 異なる正規表現構文 があります。 awkとgrep -Eの正規表現構文はほぼ同じです(拡張正規表現)。
  • cut -d ' 'は、個々のスペース文字を区切り文字として扱います。 Awkのデフォルトの区切り文字は任意の空白シーケンスであり、複数のスペース、タブなどにすることができます。cutで区切り文字として任意の空白シーケンスを使用することはできません。 awkで個々のスペースをセパレーターとして使用するには、フィールドセパレーターを、単一のスペースで構成される正規表現(「任意の空白シーケンス」、つまりデフォルトを意味する特殊なケース)以外の単一のスペースに一致する正規表現に設定します:awk -F '[ ]' '/Word/ {print $2}'

¹ プログラム最適化の最初のルール:実行しないでください。プログラム最適化の2番目のルール(専門家のみ!):まだ実行しないでください。Michael A. Jackson

あなたの命令、

cat fileName | awk '/Word/ { print $2 }'

catコマンドすら必要ありません。あなたが試すかもしれません、

awk '/Word/ { print $2 }' filename

以下のコマンドは、出力をcatからgrepにリダイレクトし、次にcutにリダイレクトします。

cat fileName | grep Word | cut -f 2 -d ' '

ほとんどの場合、出力リダイレクトを回避する必要があります。 Awkは1行でジョブを実行しますが、cutは特定のWordを含む行のみを取得するためにgrepコマンドを必要とし、区切り文字スペースに従って列2を出力します。

カットが失敗した場合、あなたはawkで物事を行うことができます。

1
Avinash Raj