このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:パターンの指定:awkコマンド

awkコマンドの概要

 awkは、テキストデータを処理し、必要な情報を抽出・加工するための強力なツールです。awkコマンドは、各行をレコードとして読み込み、スペースやタブで区切られた各要素をフィールドとして扱います。指定したパターンに基づいてテキストを検索し、アクションを実行します。

awkコマンドの書式

【書式】
awk 'パターン { アクション }' ファイル名

  • パターン:アクションを実行する条件を指定します。
  • アクション:パターンにマッチした場合に実行される処理を記述します。

 awkのスクリプトは、パターンアクションで構成されます。パターンを省略すると、すべての行がアクションの対象となります。パターンには条件式や正規表現を指定でき、アクションにはprintや計算式などの処理を記述します。

例:awk '{print $1, $9}' ファイル名

  • パターンを省略しているため、全行に対して{print $1, $9}が実行されます。

パターンの指定

 「printとフィールド変数:awkコマンド」の例では、パターンを省略したため、すべての行がアクションの対象となっていました。続いて、パターンとして「ファイル名の先頭がhostで始まる文字列」という条件を付けてみます。

正規表現によるパターン指定

 文字列のパターンを設定するには、正規表現を利用します。awkでは記述した正規表現は自動的に拡張正規表現として解釈されます。

 正規表現のパターンを指定するには、/(スラッシュ)で囲って記述します。各フィールドに対して正規表現がマッチするかどうかを調べるには、~(チルダ)を使って比較します。

コマンド例

awk '$9 ~ /^host/ {print $5, $9}'

要素の解説

要素説明
$9第9フィールド
~正規表現の比較演算子
/^host/正規表現(^は行頭、hostで始まる文字列)
{print $5, $9}アクション:第5フィールドと第9フィールドを表示
要素の解説

例:ファイル名がhostで始まる行のみを対象とする

 上のコマンドを応用して、第9フィールドが^host、つまり先頭がhostという文字列かどうかというパターンを指定します。結果として、hostで始まるファイル名だけが対象となります。

コマンド例

user01@ubuntu:~$ ls -l /usr/bin | awk '$9 ~ /^host/ {print $5,$9}'

出力結果

121672 host
35336 hostid
22760 hostname
31184 hostnamectl

コマンドの解説

  • $9 ~ /^host/:第9フィールド(ファイル名)が、正規表現^hostにマッチするかを判定します。
  • {print $5, $9}:マッチした行に対して、第5フィールド(ファイルサイズ)と第9フィールド(ファイル名)を表示します。

正規表現の比較対象の省略

 正規表現を書く際には、比較対象を省略することができます。この場合、レコード全体($0)が対象となります。

 たとえば、次のように/^l/という正規表現をパターンとして指定すると、ls -lコマンドの表示の行頭がlで始まる行、すなわちシンボリックリンクだけが表示されます。

ls -lで出力される先頭の文字のファイルタイプ

 ls -lコマンドの出力の最初の文字は、ファイルタイプを表しています。以下に、その対応をまとめます。

先頭の文字ファイルタイプ
-通常のファイル
dディレクトリ
lシンボリックリンク
cキャラクタデバイス
bブロックデバイス
sソケット
pパイプ(FIFO)
ファイルタイプ

例:行の先頭がlで始まる行のみを対象とする

コマンド例

user01@ubuntu:~$ ls -l /usr/bin | awk '/^l/ {print $1,$5,$9}'

出力結果

lrwxrwxrwx 11 GET
lrwxrwxrwx 11 HEAD
lrwxrwxrwx 11 POST
lrwxrwxrwx 47 VBoxAudioTest
lrwxrwxrwx 44 VBoxClient
lrwxrwxrwx 53 VBoxClient-all
(...省略...)

これにより、シンボリックリンクのみが表示されます。

コマンド解説

  • /^l/:行全体($0)が、正規表現^lにマッチするかを判定します。つまり、行頭がlで始まる行を対象とします。
  • {print $1, $5, $9}:マッチした行に対して、第1フィールド(パーミッション)、第5フィールド(ファイルサイズ)、第9フィールド(ファイル名)を表示します。

まとめ

  • awkコマンドでは、パターンを指定して特定の条件に一致する行に対してのみアクションを実行できます。
  • 正規表現のパターンを指定するには、/正規表現/の形式で記述し、フィールドとの比較には~演算子を使用します。
  • 比較対象を省略すると、レコード全体($0)が対象となります。
  • ls -lコマンドの出力の先頭の文字はファイルタイプを表し、これを利用して特定のファイルタイプのみを抽出できます。

 awkのパターン指定をマスターすることで、より高度なテキスト処理が可能になります。正規表現を活用し、必要な情報を効率的に抽出しましょう。