📘

【Linux】awkの使い方(メモ)

2021/12/04に公開

はじめに

テキストファイルを加工する際によく使用するawkコマンドについて、自分の知っている範囲で記事に書きたいと思います。

awkとは?

プログラミング言語の一つになります。
「オーク」と呼びます。
テキストファイルの加工・抽出等の処理が得意な言語になります。

awkの使用例

ls -lの結果から所有者/グループ名/ファイル名を抜き出す。

通常のコマンド実行結果(ls -l)
[cloudadmin@testlinux01 test]$ ls -l
合計 0
-rw-rw-r--. 1 cloudadmin cloudadmin 0 124 13:34 hello.awk
-rw-rw-r--. 1 cloudadmin cloudadmin 0 124 13:34 sample.awk
[cloudadmin@testlinux01 test]$
awkを使用した実行結果
[cloudadmin@testlinux01 test]$ ls -l | awk '{print $3,$4,$9}'
cloudadmin cloudadmin hello.awk
cloudadmin cloudadmin sample.awk
[cloudadmin@testlinux01 test]$

「$3」や「$0」について

フィールドになります。

{ print $0 }			# レコード全体を表示
{ print $1, $2, $3 }		# 第1、第2、第3フィールドを表示

以下のコマンドの実行結果をフィールドで表します。

コマンド実行例
[cloudadmin@testlinux01 test]$ ls -l
合計 4
-rw-rw-r--. 1 cloudadmin cloudadmin  0 124 13:34 hello.awk
-rw-rw-r--. 1 cloudadmin cloudadmin  0 124 13:34 sample.awk
-rw-rw-r--. 1 cloudadmin cloudadmin 33 124 13:58 test.txt
[cloudadmin@testlinux01 test]$
フィールド/レコード $1 $2 $3 $4 $5 $6 $7 $8 $9
1 -rw-rw-r--. 1 cloudadmin cloudadmin 0 12月 4 13:34 hello.awk
2 -rw-rw-r--. 1 cloudadmin cloudadmin 0 12月 4 13:34 sample.awk
3 -rw-rw-r--. 1 cloudadmin cloudadmin 33 12月 4 13:58 test.txt
  • レコード全体を表示する。
コマンド実行例
[cloudadmin@testlinux01 test]$ ls -l | awk '{print $0}'
合計 4
-rw-rw-r--. 1 cloudadmin cloudadmin  0 124 13:34 hello.awk
-rw-rw-r--. 1 cloudadmin cloudadmin  0 124 13:34 sample.awk
-rw-rw-r--. 1 cloudadmin cloudadmin 33 124 13:58 test.txt
[cloudadmin@testlinux01 test]$
  • レコード「$4」を抽出する。
コマンド実行例
[cloudadmin@testlinux01 test]$ ls -l | awk '{print $4}'

cloudadmin
cloudadmin
cloudadmin
[cloudadmin@testlinux01 test]$
  • grepと組み合わせる。
コマンド実行例
[cloudadmin@testlinux01 test]$ ls -l | grep hello.awk | awk '{print $1,$3,$4,$9}'
-rw-rw-r--. cloudadmin cloudadmin hello.awk
[cloudadmin@testlinux01 test]$

特定のファイル名を抽出する。

/etc/passwdからcloudadminの行を抽出します。grepと同じ使い方です。

grepにて抽出
[cloudadmin@testlinux01 ~]$ cat /etc/passwd | grep cloudadmin
cloudadmin:x:1000:1000:cloudadmin:/home/cloudadmin:/bin/bash
[cloudadmin@testlinux01 ~]$
  • コマンド構文
コマンド
awk '/文字列/' ファイル名
  • 実行例
awkにて抽出
[cloudadmin@testlinux01 ~]$ awk '/cloudadmin/' /etc/passwd
cloudadmin:x:1000:1000:cloudadmin:/home/cloudadmin:/bin/bash
[cloudadmin@testlinux01 ~]$

テキストファイルから一致している文字列を抜き出す

テキストファイルから一致している文字列があれば抜き出します。

  • コマンド構文
コマンド
awk '$0 == "文字列" { print $0}' ファイル名
  • 実行例
実行例
[cloudadmin@testlinux01 test]$ awk '$0 == "foo" { print $0}' test.txt
foo
[cloudadmin@testlinux01 test]$

指定した行を抜き出す

以下ファイルより2行目を抜き出します。

test.txt
foo
82niupfa
fajaf
test
testtest
  • コマンド構文
コマンド
awk ' NR == 行数 { print $0 }'  ファイル名
  • 実行例
実行例
[cloudadmin@testlinux01 test]$ awk ' NR == 2 { print $0 }'  test.txt
82niupfa
[cloudadmin@testlinux01 test]$

参考

awkって何?何ができるの?をできる限りわかりやすく伝えたい
[初心者向け]Awkの使い方
とほほのAWK入門
awkでgrepのように行を抽出する

Discussion