そこにあるすべてのLinuxコマンド(そしてたくさんあります)の中で、最も典型的な3つはsed
のようです 、awk
、およびgrep
。たぶんそれは彼らの名前の不可解な音、または彼らの潜在的な使用の幅、あるいは単に彼らの年齢ですが、誰かが「Linuxy」コマンドの例を挙げているとき、それは通常それらの3つのうちの1つです。そして、sed
およびgrep
いくつかの単純な1行の標準があり、あまり有名ではないawk
特に不可解であるために永続的に目立つままです。
sed
を使用する可能性があります クイック文字列置換またはgrep
毎日パターンをフィルタリングします。 awk
を作成する可能性ははるかに低くなります 指図。これがなぜなのかとよく疑問に思いますが、それはいくつかの理由によるものです。まず第一に、私たちの多くはほとんどsed
を使用していません およびgrep
これらの2つのコマンドのバリエーション以外の場合:
$ sed -e 's/foo/bar/g' file.txt
$ grep foo file.txt
その他のLinuxリソース
- Linuxコマンドのチートシート
- 高度なLinuxコマンドのチートシート
- 無料のオンラインコース:RHELの技術概要
- Linuxネットワーキングのチートシート
- SELinuxチートシート
- Linuxの一般的なコマンドのチートシート
- Linuxコンテナとは何ですか?
- 最新のLinux記事
したがって、sed
の方が快適だと感じるかもしれませんが およびgrep
、あなたはそれらの可能性を最大限に活用することはできません。もちろん、sed
について詳しく知る義務はありません。 またはgrep
、しかし私は時々コマンドを「学ぶ」方法について疑問に思います。 方法を学ぶ代わりに コマンドは機能しますが、コマンドを含む特定の呪文をよく学びます。その結果、私はしばしばコマンドに誤った親しみを感じます。コマンドの機能がわからず、構文に指を置くことができなくても、頭のてっぺんから3つまたは4つのオプションに名前を付けることができるので、コマンドを知っていると思います。
そしてそれが、awk
のパワーと柔軟性に直面したときに多くの人が直面する問題だと私は信じています。 。
awkを使用するためのawkの学習
awk
の基本 驚くほどシンプルです。 awk
はプログラミング言語であり、比較的基本的な言語ですが、それは事実です。これは、awk
を学ぶことができることを意味します 新しいコーディング言語を学ぶのと同じ方法です。いくつかの基本的なコマンドを使用して構文を学び、複雑なアクションを構築できるように語彙を学び、練習、練習、練習します。
awkが入力を解析する方法
Awk
入力は、基本的に配列と見なされます。 awk
の場合 テキストファイルをスキャンし、各行を個別に連続してレコードとして扱います。 。各レコードはフィールドに分割されます 。もちろん、awk
この情報を追跡する必要があり、NR
を使用してそのデータを確認できます (レコード数)およびNF
(フィールド数)組み込み変数。たとえば、これによりファイルの行数がわかります:
$ awk 'END { print NR;}' example.txt
36
これにより、awk
についての情報も明らかになります。 構文。 awk
を書いているかどうか ワンライナーまたは自己完結型スクリプトとして、awk
の構造 指示は次のとおりです:
pattern or keyword { actions }
この例では、単語END
パターンではなく、特別な予約キーワードです。同様のキーワードはBEGIN
です 。これらのキーワードの両方を使用して、awk
データの解析の開始時または終了時に中かっこでアクションを実行するだけです。
パターンを使用できます awk
となるように、フィルターまたは修飾子として パターンを現在のレコードに一致させることができる場合にのみ、特定のアクションを実行します。たとえば、awk
を使用するとします。 、grep
と同じように 、 Linuxという単語を検索する テキストのファイル内:
$ awk '/Linux/ { print $0; }' os.txt
OS: CentOS Linux (10.1.1.8)
OS: CentOS Linux (10.1.1.9)
OS: Red Hat Enterprise Linux (RHEL) (10.1.1.11)
OS: Elementary Linux (10.1.2.4)
OS: Elementary Linux (10.1.2.5)
OS: Elementary Linux (10.1.2.6)
awk
の場合 、ファイルの各行はレコードであり、レコードの各単語はフィールドです。デフォルトでは、フィールドはスペースで区切られます。 --field-separator
で変更できます FS
を設定するオプション (フィールドセパレータ)任意の変数に変更できます:
$ awk --field-separator ':' '/Linux/ { print $2; }' os.txt
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)
このサンプルでは、各コロンの後に空白があるため、各リストの前に空白があります(:
)ソーステキスト内。これはcut
ではありません ただし、フィールドセパレータを1文字に制限する必要はありません:
$ awk --field-separator ':' '/Linux/ { print $2; }' os.txt
CentOS Linux (10.1.1.8)
CentOS Linux (10.1.1.9)
Red Hat Enterprise Linux (RHEL) (10.1.1.11)
Elementary Linux (10.1.2.4)
Elementary Linux (10.1.2.5)
Elementary Linux (10.1.2.6)
awkの関数
awk
で独自の関数を作成できます この構文の使用:
name(parameters) { actions }
関数を使用すると、コードを1回記述して、作業全体で再利用できるため、関数は重要です。ワンライナーを作成する場合、カスタム関数はスクリプトよりも少し便利ではありませんが、awk
すでに多くの関数を定義しています。これらは基本的に、他の言語やスプレッドシートの関数と同じように機能します。関数に情報が必要な順序を学習し、結果を得たいものは何でもフィードできます。
数学演算と文字列処理を実行する関数があります。数学のものはしばしばかなり簡単です。あなたは番号を提供し、それはそれをクランチします:
$ awk 'BEGIN { print sqrt(1764); }'
42
文字列関数はもっと複雑になる可能性がありますが、GNUawkマニュアルに詳しく記載されています。たとえば、split
関数は、awk
というエンティティを取ります 単一のフィールドとして表示し、それをさまざまな部分に分割します。フィールド、分割の各部分を含む配列として使用する変数、および区切り文字として使用する文字が必要です。
前の例の出力を使用すると、各レコードの最後にIPアドレスがあることがわかります。この場合、レコードの最後のフィールドだけをsplit
に送信できます。 変数NF
を参照して関数を作成します フィールドの数が含まれているため(最後のフィールドは最大数である必要があります):
$ awk --field-separator ': ' '/Linux/ { split($NF, IP, "."); print "subnet: " IP[3]; }' os.txt>
subnet: 1
subnet: 1
subnet: 1
subnet: 2
subnet: 2
subnet: 2
他にも多くの機能があり、awk
のブロックごとに1つに制限する理由はありません。 コード。 awk
を使用して複雑なパイプラインを構築できます ターミナルで、またはawk
と書くことができます 独自の機能を定義して利用するためのスクリプト。
eBookをダウンロード
awk
を学ぶ ほとんどの場合、awk
を使用する必要があります 。 sed
ですでに持っている機能を複製することを意味する場合でも使用してください またはgrep
またはcut
またはtr
またはその他の完全に有効なコマンド。慣れたら、カスタムのawk
を呼び出すBash関数を記述できます。 使いやすいコマンド。そして最終的には、複雑なデータセットを解析するためのスクリプトを作成できるようになります。
ダウンロード 電子書籍 awk
について知っておくべきことをすべて学ぶ 、そして今日から使い始めてください。