【awk】カラム位置を表示する方法 | 瀬戸内の雲のように

【awk】カラム位置を表示する方法

Posted: 2019-02-11


スポンサーリンク

目次

はじめに

何年か前に「お前コードって書けるの?」と上司に聞かれて「はい、まぁ。。。bashとかawkなら。。」と答えたところ、「それはプログラミングとは言わん!」と言われた私です。
懲りずにawkのtipsを書いていきます。

 

今回やりたいこと

awkを使うとき、「このカラムだけ抜き出したい」と思うことってありますよね。と言うかawkを使うときは大半がそんな理由です。
そんなとき、私は目視で数えることが多いんですが、これって意外と時間がかかってしまいます。
そんで間違ってたりすると、「あああ、もう!」 ってなっちゃいます。

と言うことで、今回は少しスマートにやる方法を書いていきたいと思います。

 

環境

大抵のlinuxなら動くと思います。

 

方法

と言うことで早速ですがやり方を書いていきます。

前提

以下のようなファイルを例に説明していきます。

# cat httpd.log
93.72.182.31 - - [12/Feb/2019:03:16:54 +0900] "GET /blogs/43/ HTTP/1.0" 200 16589 "https://www.setouchino.cloud/blogs/43/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36"
157.55.39.80 - - [12/Feb/2019:03:20:39 +0900] "GET / HTTP/1.1" 200 15289 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
40.77.167.168 - - [12/Feb/2019:03:21:29 +0900] "GET /blogs/32 HTTP/1.1" 200 19543 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
157.55.39.80 - - [12/Feb/2019:03:42:13 +0900] "GET /blogs/75 HTTP/1.1" 200 15675 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
202.241.208.102 - - [12/Feb/2019:03:46:13 +0900] "GET /ads.txt HTTP/1.1" 404 1564 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
61.22.113.206 - - [12/Feb/2019:03:47:59 +0900] "GET /blogs/34 HTTP/1.1" 200 15997 "https://www.google.com/" "Mozilla/5.0 (X11; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0"
61.22.113.206 - - [12/Feb/2019:03:47:59 +0900] "GET /assets/application-a59573c82db0e744fde06a0ffd9b6826ca382f5e33035851f92a5cd8a4acb329.css HTTP/1.1" 200 143014 "https://www.setouchino.cloud/blogs/34" "Mozilla/5.0 (X11; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0"
61.22.113.206 - - [12/Feb/2019:03:47:59 +0900] "GET /assets/setouchi-af48e4bdab27db4b7c7bf0f4f2c507cb71700b2b93fd15a4c6a3915f9a94f086.jpg HTTP/1.1" 200 22747 "https://www.setouchino.cloud/blogs/34" "Mozilla/5.0 (X11; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0"
61.22.113.206 - - [12/Feb/2019:03:47:59 +0900] "GET /assets/logo2_small-14b4e860c00ad245c22f53f642f267a68aaf958a6580b1e1f84e3a986f1456a3.png HTTP/1.1" 200 6059 "https://www.setouchino.cloud/blogs/34" "Mozilla/5.0 (X11; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0"
61.22.113.206 - - [12/Feb/2019:03:47:59 +0900] "GET /uploads/picture/image/40/size_400x300_gvim.png HTTP/1.1" 200 27496 "https://www.setouchino.cloud/blogs/34" "Mozilla/5.0 (X11; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0"
61.22.113.206 - - [12/Feb/2019:03:47:59 +0900] "GET /uploads/picture/image/41/size_400x300_gvim2.png HTTP/1.1" 200 99020 "https://www.setouchino.cloud/blogs/34" "Mozilla/5.0 (X11; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0"
61.22.113.206 - - [12/Feb/2019:03:47:59 +0900] "GET /favicon.ico HTTP/1.1" 200 0 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0"

このように 同じフォーマットの内容が複数行出力された ファイルの場合に使う前提です。
このログから アクセスされたURL のカラム位置を知りたい場合を想定してください。

コマンド

今回は for文を使ったやり方を説明します。

コマンド

awk 'NR==1{for(i=1;i<NF;i++){print i "カラム目は: " $i "です"}}' httpd.log

結果は以下の通り。

1カラム目は: 93.72.182.31です
2カラム目は: -です
3カラム目は: -です
4カラム目は: [12/Feb/2019:03:16:54です
5カラム目は: +0900]です
6カラム目は: "GETです
7カラム目は: /blogs/43/です
8カラム目は: HTTP/1.0"です
9カラム目は: 200です
10カラム目は: 16589です
11カラム目は: "https://www.setouchino.cloud/blogs/43/"です
12カラム目は: "Mozilla/5.0です
13カラム目は: (Windowsです
14カラム目は: NTです
15カラム目は: 10.0;です
16カラム目は: Win64;です
17カラム目は: x64)です
18カラム目は: AppleWebKit/537.36です
19カラム目は: (KHTML,です
20カラム目は: likeです
21カラム目は: Gecko)です
22カラム目は: Chrome/68.0.3440.84です

いかがでしょうか。URLが記載されているカラムは 11カラム目 であることがわかります。

解説

awkは区切りが分かりづらいので、もう少しわかりやすく書きます。

awk '
    NR==1{
        for(i=1;i<NF;i++){
              print i "カラム目は: " $i "です"
        }
    }' httpd.log

各行の意味は、

  • 2行目は NR(行番号)が1の場合のみ。つまり、 1行目だけを対象とする ということ (同じフォーマットが続く前提なので)
  • 3行目は for文で、 カラムの数だけ繰り返す という意味です。awkの $0 は行全体を表すので、 i=1で始めるのがコツです
  • 4行目は 現在のカラム番号と現在の内容を表示する行です

 

まとめ

ということでawkの各カラム番号を表示するやり方でした。


スポンサーリンク




コメント一覧


コメントを投稿する


お名前


コメント内容





TOP back