AWKを学ぶ理由はまだありますか?


109

私は常に問題の正しい解決策を使用したいので、古いツールを含め、新しいツールを常に学習しています。

それでも、それらのいくつかを学ぶ理由はまだあるのだろうか。awkたとえば、私には興味深いですが、単純なテキスト処理の場合は、、、、などを使用できますがgrep、複雑なテキスト処理の場合はcutsedPythonを使用します。

だからといって、それが強力で便利なツールではないという意味ではありません。しかし、新しいツールを学ぶには時間と労力がかかるので、それだけの価値はありますか?


2
それは2019年で、awkでpython log normalizerを書き直しました。5千4百万行のログファイル(約9 GB)のログファイルを1週間変換しました。私のMacbook Pro(2.8 GHZ i7、16 GB Ram)では、Pythonバージョンで1秒あたり約10k行=> 90分のランタイムを処理できました。mawkを使用すると、実行時間が2分に短縮されました。ところで、awkプログラムは半分のサイズでした。
ミスタヘンリー

@mistahenry pypyを試しましたか?
qwr

回答:


97

自分がいる環境に依存すると思います。* nixの人なら、知ることawkは良いことです。ほぼすべての* nixにある他の唯一のスクリプト環境はshです。したがってgrepsed,などは確かにawk現代の主流のlinuxディストリビューションに取って代わることができますが、よりエキゾチックなシステムに移行すると、少し知っているawkことは本当の意味で便利です。

awkテキスト処理以外にも使用できます。たとえば、私の監督者の一人が天文学のコードを書いていますawk-それは彼がどれほど完全に古い学校素晴らしいかです。彼の時代には、それは仕事に最適なツールでした...そして今、私のような彼の生徒たちはpythonを使っていますが、そうでない場合でも、彼は自分が知っていることとうまく機能することにこだわっています。

締めくくりに、世界中にキックしている古いコードがたくさんありますawk。それはまたあなたをより良くします* nix人:-)


12
++そうですね、awkは* nixツールセットの中で最も移植性が高く、重要なことに一貫性のあるツールの1つです。たとえば、perlが見つからない場所であるbusyboxで確実に動作します。

1
中括弧の言語に慣れていても、学ぶのはそれほど難しくありません

2
「どの環境でも同じです」-完全ではありません:Windowsでは、単一引用符をdoubleに置き換え、内部のdoubleをエスケープする必要があります。(Windowsは、レドモンドの安全でない半完成の残虐行為に身をさらしたとしても、ロシアの15歳児のなすがままになっても、実際の環境のようなものです)。
GT。

6
私は多くの人が同じ宇宙のawkとwindowsの存在を関連付けているとは思わない.....:P
FoldedChromatin

2
テキスト処理ジョブには引き続きawkを使用しています。私はしばしばスクリプトを別のもの(ruby、python)で開始し、単純さとパワーのためにawkに戻ることになります。
ランブルウィード2016年

103

awkの基本をすぐに習得すれば、コマンドラインで実際に素晴らしいことを行うことができます。

しかし、awkを学ぶ本当の理由は、作者のAho、Kernighan、およびWeinbergerによるすばらしいThe AWK Programming Languageを読む口実を持つことです。名前から、それは単にあなたにawkを教えると思うでしょう。実際、それはほんの始まりにすぎません。文字列の操作を簡単にする簡潔なスクリプト言語を使用することで対処できるさまざまな問題に乗り出し、awkは最初の1つでした。データベース、パーサー、インタープリターの実装方法を読者に教え始めました。 、そして(メモリが私に役立つなら)小さなプロジェクト固有のコンピュータ言語用のコンパイラ!彼らがawkを使用してサンプルのオペレーティングシステムもプログラミングしていれば、この本はコンピュータサイエンスのかなり完全な調査の紹介になったでしょう。

元のC言語の本のように、非常に明快で簡潔なことも、親しみやすいテクニカルライティングが正しく行われた素晴らしい例です。インデックスも職人技の一部です。

あれ?わかっている場合は、コマンドラインで時々使用しますが、それよりも大きいと、Pythonのようなものが提供するシステムやインターネットのより広い機能にアクセスできず、閉じ込められているように感じます。しかし、本?あなたはいつもそれを読んでうれしいです!


5
+1販売済み。この本を注文します。私はawkを、速くて強力な1行のスクリプト言語として何年も使ってきました。Awkは、コードの作成に数十行かかるファイルの優れたプリプロセッサです。フォームを使用した回数を数えることはできません
。awk

2
同意した。それは、その本がそれが含むすべてのものを与えられるとどれほどコンパクトであるかという信念をほとんど否定します。それは長さの1/10(?)でほとんどの現代的な本よりも多くをカバーしています。
粘土

3
私はこの本を今読んでおり、awkに対する執着心への私の熱意を煽っています。
galaxywatcher 2012年

3
優れたGawk:効果的なAWKプログラミングもご覧ください。
lhf 2012

1
最初の章を読んだだけです。すごいです。ミステリーは解決しました。
vaichidrewar 2015

29

私が使用する唯一の理由awkは自動分割です:

awk '{print $3}' < file.in

これにより、3つ目の空白区切りフィールドがに出力されfile.inます。それは少し簡単です:

tr -s ' ' < file.in | cut -d' ' -f3

3
awk '{print $3}' < file.in代わりになぜ使用するのawk '{print $3}' file.inですか?引数として渡されたとき、awkはすでにファイルを読み取っていませんか?
mbigras

@mbigras確かに、どちらの方法でもawkを使用できます。
グレッグヒューギル2017年

doublesizeでも、非awkソリューションが好きです。そして、なぜ私が嫌いなのかわかりませんawk:/
MD。Mohiuddin Ahmed

25

ファイルに列/フィールドが含まれている場合、awkはすばらしいと思います。複数列ファイルの特定の列を処理/分析するときに使用します。または、特定の列を追加/削除したい場合。

例えば

awk -F \t '{ if ($2 > $3) print; }' <filename>

タブ区切りファイルの2列目の値が3列目の値より大きい場合にのみ印刷されます。

もちろん、PerlやPythonを使用することもできますが、awkを使用すると、簡潔な1行のコマンドで非常に簡単になります。

また、awkの学習はかなり低コストです。awkの基本を1時間未満で習得できるので、他のプログラミング/スクリプト言語を習得するほどの労力は必要ありません。


私は実際にはawkをあまり使用していませんが、これはawkの優れた使用法です。
ポールネイサン

8

HTMLの処理にAWKを使用することがあります。たとえば、次のコードはテーブルをcsvファイルに変換します。

BEGIN {s=""; FS="n"}
/<td/ { gsub(/<[^>]*>/, ""); s=(s ", " $1);}
/<tr|<TR/ { print s; s="" }

これは、画面をこする場合に最適です。実際、私がAWKを気に入っているのは、問題に対する間違った解決策をすばやく作成できるためです。ジョン・ベントレーの素敵なプログラミング真珠にも言及されています。


7

私は時々awkを使用します。パイプラインの途中で非常に単純なテキストをシャッフルするのに適しています。まったく必要ない場合と、Perl / Python /その他を必要としない場合の、非常に狭いニッチを埋めます。

私はあなたがそれに多くの時間を費やすことを勧めませんが、構文の基本を知るのに役立つかもしれません-少なくともあなたがそれを使いたいと思ったなら、あなたがすぐにマニュアルを参照できるほど十分です。


5

ほとんどのawkワンライナーは、Perlワンライナーで実現できます。Perlワンライナーの考え方を取り入れることを選択した場合。または、Perlの3つのライナーを使用するだけです:)

awkが好きな人が書いたシェルスクリプトを管理している場合は、明らかにawkを学ぶ必要があります。

実用的なニーズがなくても、正規表現を知っていれば、基本を習得するのにそれほど時間はかかりません。当時の設計方法を見るのは楽しいです。それはかなりエレガントです。


5

この質問をしてから6年後、私は確実に答えることができるようになりました。いいえ、awkを学ぶことは価値がありません。

基本的なタスクは処理されますが、基本的なbashコマンド、またはGUIツールでさえ簡単です。より複雑なタスクは、Python(favまたはmine)やRubyなどの最新の動的言語で簡単に取り組むことができます。

非常に多くのタスク(Web、管理、データ処理、自動化など)に役立つので、mordernスクリプト動的言語を確実に学ぶ必要があります。そして、そうすることにより、awkなどのツールを完全に役に立たないことを学ぶことで、毎月数秒で最大で数秒節約できます。


2
必ずしもそうではありません。非常に大きなファイルを解析する場合は、他のツールよりもはるかに高速です。
user1071847

この数年後、あなたはまだawkについて質問しているので興味深いです。私は最初のレスポンダーの1人でしたが、今でも一定の規則性をもって使用しています
Dexygen

4

すでにsedを知っていて使用している場合は、少なくとも少しawkを取得することもできます。それらは、いくつかのかなり強力なトリックのために一緒にパイプすることができます。常に聴衆を感動させます。


4

Computerworldは最近、AWKについてAlfred V. Aho(AWKの3人の作成者の1人)にインタビュー行いました。それは非常に興味深い読み物です。そのため、ヒントが見つかるかもしれません。なぜAWKを学ぶのが良いのでしょうか。


いいですが、納得しませんでした。AWKは非常に優れたツールですが、sedやpythonで自分のソリューションをハッキングする代わりに、時間をかけて学ぶのに十分な時間は必要ないと思います。
e-satis

4

Perlや他のほとんどのスクリプト言語がインストールされていない組み込みLinuxシステムに取り組んでいる前回の契約では、AWKを学ぶことは私にとって非常に貴重でした。


2
9年後、gitログをgrepしているときに今日awkをたくさん使用しました
Dexygen

3

awkには非常に優れた比率のユーティリティ/難易度があり、「単純なawk」はすべてのUnix / Linux / MacOSで機能します(他のシステムにもインストールできます)。

それは人々がタイピングを嫌っていた黄金時代に設計されたので、スクリプトは非常に、非常に短く、速く書くことができます。私は高速バージョンのmawkをインストールしようとします。これにより、計算が約9倍高速化され、awk / gawkがかなり遅くなるため、Rなどの代わりに使用したい場合は、mawkが必要になる場合があります。


2

シェルスクリプティング中にログファイルでデータまたはプログラムの出力を時々解析する必要がある場合に、これは主に役立ちます。awkでは、Pythonのコード行が少し増えるため、非常に簡単に実行できるためです。

それは確かにそれよりも強力ですが、これはほとんどの人がそれを使用するタスクのようです。


2

もちろん、私は使用可能な言語が次の環境で作業しています:(COBOL、OMG、OMGを生成する一部のshity言語)、bash(古いバージョン)、perl(まだマスターしていません)、sed、awk 、および他のいくつかのコマンドラインユーティリティ。知るawkことで私は数時間節約できました(そして私の同僚からいくつかのテキスト処理タスクが生成されました-それらは少なくとも1日に3回私にやって来ました)。


1

もう価値がないと思う。私は時々それを検索機能が含まれているsedよりもはるかに用途の広いストリームエディターとして使用しますが、Pythonに習熟している場合、必要な時間を補うためにはるかに速く完了することができるタスクを知りませんawkを学ぶ。

次のコマンドは、おそらく過去2年間にawkを使用した唯一のコマンドです(Debian / Ubuntuシステムから半分削除されたパッケージを削除します)。

$ dpkg -l|awk '/^rc/ {print $2}'|xargs sudo dpkg -P

1

いいえ。

おもしろいかもしれませんが、あなたはawkができることすべてをPerlなどのより強力なツールを使って行うことができます。

これらのより強力なツールを学習するために時間を費やしてください-そして、偶然に途中でいくつかのawkを拾ってください。


1

あると思います。単純なものについては、AWKはPythonよりも経験の浅いsysadmin /開発者にとってはるかに簡単です。AWKを少し学び、多くのことを行うことができます。Pythonを学ぶということは、まったく新しい言語を学ぶことを意味します(そうです、AWKは言語でもあるということを知っています)。

PerlはAWKでできることの多くを実行できるかもしれませんが、この時代の選択肢を提供し、ここでPythonを選択します。だからはい、あなたはAWKを学ぶべきです。しかし、Pythonも学びます:-)


1

awkはpowertool言語なのでawk、何らかのITプロフェッショナルであれば、どこかで使用されていることに気付くでしょう。あなたはの構文や正規表現を扱うことができる場合grepsed、あなたは何の問題拾いを持つべきではないawk、それはおそらくに価値があります。

私がawk本当に優れているのは、複数行のレコードの処理や複数のファイルの同時処理/内挿などの処理を簡素化することです。


0

PERLはほとんどすべての重要なプラットフォームに移植されているので、価値がないと思います。sedとawkを一緒に使うよりも用途が広いです。自動分割については、perlで次のように実行できます。

perl -F':' -ane 'print $F[3],"\n";' /etc/passwd

編集:他のいくつかのツールはパターンベースのアクションの哲学に基づいているため(たとえば、SolarisのDTraceなど)、awkをある程度理解することをお勧めします。


0

私は、ファイルが列形式の領域で作業します。したがって、awkは、異なるソフトウェアが連携して動作できるようにファイルを再フォーマットするために私にとって非常に貴重です。非ITの専門家にとって、awkの使用は十分で完璧です。今日、コンピューターの速度は問題ではないので、awkとunixを組み合わせて、多くの1ライナーコマンドを「スクリプト」にパイプすることができます。フィールドとレコードによるAwk検索では、「vi」を使用してファイルを開く代わりに、ファイルデータを非常に高速にチェックするために使用します。特にawk機能は私の仕事に喜びをもたらしたと言わざるを得ません。awkを使用すると、同僚が素早く物事を整理できるように支援することができます。すばらしいコード。


0

私は最近、20Gbsを超えるDOS攻撃を記録するネットワークpcapファイルを視覚化しようと試みていました。タイムスタンプとIPアドレスが必要でした。私のシナリオでは、AWKのワンライナーは非常に高速に動作しました。私は特にAWKを使用して、抽出されたファイルをクリーンアップし、グループ化された期間内のIPアドレスとそれらのIPアドレスからの合計パケット数を取得しました。私は他の人が上に書いたものに完全に同意します。それはあなたのニーズに依存します。


0

awkを学習しない理由の1つは、正規表現に貪欲でない一致がないことです。

私はawk / gawkに貪欲でない一致などのものがなく、一部の正規表現を適切に実行できないことを突然デバッグしたために、今すぐ書き直さなければならないawkコードがあります。


0

それはあなたのチームメイトとあなたのリーダーとあなたが取り組んでいるタスクに依存します。

if( team mates and leader ask to write awk ){
  if( you can reject that){
    if( awk code is very small){
      learn little just like learn Regex
    }else{
      use python or even java
    }
  }else{
    do as they ask
  }
}

0

現在、Pythonでコーディングを行っています。しかし、私はまだ、それが単純な1回限りのファイル変換に簡単に使用できるほどよくわかりません。

awkを使用すると、UNIXコマンドラインで1行のコードをすばやく開発できます。私がawkを使用するたびに、私が書くコードは使い捨てになり、数行以内になります。多分「if」ステートメントと「printf」ステートメントは、ここかそこの1行にあります。

awkを使用して10行を超えるコードを記述したことはありません。私は数年前にそのようなスクリプトをいくつか見ました。

しかし、何行ものコードが必要な場合は、Pythonを使用します。

私はawkが大好きです。これは、sedと組み合わせると非常に強力なツールです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.