サイバーセキュリティ調査記録

サイバーセキュリティに関連する情報ブログです

失敗例で学ぶawkにシェル変数を渡す方法

awk変数とシェル変数は違う

ログ解析などでシェルスクリプトを書く機会があると思います。解析に便利な「awk」を使うとき、文法はあっていそうだけど期待通りに動作してくれないケースがあります。その原因は、シェル変数とawkで利用する変数(以下、awk変数)がごちゃ混ぜになっていることかもしれません。

基本知識

「test.txt」というファイルから条件に応じたデータ出力を考えてみます。ここで、「test.txt」の内容は以下の通りです。

1111 2222
fuga aaaa
3333 4444

本題ですが、シェルスクリプト内で定義した変数はawk変数として使用できません。以下のスクリプトを見てみましょう。

#/bin/bash
hoge="fuga"
awk '($1~$hoge){print $0}' test.txt

このスクリプトの期待する動作としては、

  1. hoge=fugaとして定義
  2. awk内の「($1~$hoge)」で「test.txt」の1列目に変数「hoge」、つまり「fuga」の文字列がないか検索
  3. ヒットしたら当該行を出力(「print $0」の個所)

しかし、実行しても何も表示されません。原因は$hogeはシェル変数であり、awk内で変数を利用する文法が間違っているためです。

ここで、awkで変数を利用する正しい文法を用いて書き直したスクリプトは以下の通りです。

#/bin/bash
hoge=fuga
awk -v poke="$hoge" '($1~poke){print $0}' test.txt

awk内で「-v」を利用してawk変数「poke」にシェル変数「$hoge=fuga」を割り当てています。「-v」の代わりに「--assign」も利用できます。この変数定義によって、test.txtの1行目に「poke=$hoge=fuga」の文字列が存在する行を出力するスクリプトになります。結果は以下の通りです。

fuga aaaa

色々な失敗例

上述のスクリプトをベースに失敗例を見てみましょう。

awk変数に「$」をつける

#/bin/bash
hoge=fuga
awk -v poke="$hoge" '($1~$poke){print $0}' test.txt

このスクリプトはシングルクォーテーション内のawk変数「poke」にシェル変数のノリで「$」を付与して「$poke」としている例です。これはawk変数「poke」と評価されず、期待される動作になりません。

正規表現を使ったカオス

一般的にawkでは以下のような正規表現リテラル「//」を使ってスクリプトを書くことができます。

#/bin/bash
awk '($1~/png|jpg|css/){print $0}' access.log

「//」が正規表現を使用する開始と終了の合図となります。このスクリプトでは「access.log」内の1列目にpng、jpg、cssの文字列がある行を出力します。
ログ解析の場面では、特定拡張子へのリクエストを抽出・除外するために便利な表記方法です。この癖で先ほどのスクリプトを以下のように書いてみました。

#/bin/bash
hoge=fuga
awk -v poke="$hoge" '($1~/poke/){print $0}' test.txt

これは正常に動作しません。理由は正規表現リテラル「//」で囲っているため、「($1~/poke/)」内の「poke」はawk変数「poke」ではなく文字列「poke」と評価されるためです(正規表現リテラル内が文字列で評価されるのは仕様)。

終わり

スクリプトを書く際の手癖や思い込みで期待する動作にならない代表格として今回の例を取り上げました。この他にもシングルクォーテーションやダブルクォーテーションに気を付ける点など様々あります。1つ1つの意味について理解してスクリプトを作成していきましょう。私も気をつけます!(`・ω・´)

AWSクラウドプラクティショナー合格まで

AWSクラウドラクティショナーとは

AWS資格のエントリー資格です。簡単といわれる資格ですが、しっかりと学習しないと普通に落ちますので対策が必要です。また、下記に記載する通り、取得のメリットはかなり大きいと考えます。

資格取得のメリット

・数多のAWSサービスの用途をしっかり理解できる
・似たようなサービスが並ぶ際、与えられた条件に対してどれがベストか考察できるようになる
・全ての上位資格の基盤が作る事ができる

執筆者のバックグラウンド

普段はセキュリティエンジニアとして仕事しているため、検証環境としてAWSサービスはEC2、S3辺りを1年程度使用していた程度です。

学習時間

約1か月

使用教材

1. AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト

AWSクラウドラクティショナーの上位資格用テキストです。同テキストシリーズの中にクラウドラクティショナーのテキストもありますが、ソリューションアーキテクト - アソシエイト用のテキストの使用をお薦めします。

2. Udemy

問題集として使用します。Udemyの教材は高いですが、頻繁にセールをやっており、その際はとても安く購入する事ができます。上記テキストで学習しつつ、セールになるのをまって購入しましょう。

下記の通り、6回分の模擬試験が収録されています。このボリュームで十分です。

・模擬試験(基本レベル1)
・模擬試験(基本レベル2)
・模擬試験(応用レベル1)
・模擬試験(応用レベル2)
・模擬試験(応用レベル3)
・オプショナル問題(難易度高:アソシエイト試験レベル)
www.udemy.com

学習方法

知識のインプット

AWS認定ソリューションアーキテクト - アソシエイト」を大体3週読みましょう。1週目はサラッと読んで全体にどのような事が書かれているか理解してください。その次の週で細かく読んでください。ただし、模擬試験を解く際にテキストに戻る為、時間はあまりかけなくて良いです。

知識のアウトプット

Udemyの問題を解いていきます。はじめは全然解けないと思いますが気にする必要はありません。問題傾向がわからない状態の試験では当然の現象です。私の場合、下記の通り実施しました。

・模擬試験(基本レベル1)
実施日時:11/11、得点率:69%
実施日時:11/17、得点率:86%
実施日時:12/14、得点率:86%

・模擬試験(基本レベル2)
実施日時:11/12、得点率:63%
実施日時:11/22、得点率:80%
実施日時:12/15、得点率:87%

・模擬試験(応用レベル1)
実施日時:11/15、得点率:56%
実施日時:11/28、得点率:80%
実施日時:12/16、得点率:90%

・模擬試験(応用レベル2)
実施日時:12/04、得点率:47%
実施日時:12/17、得点率:72%

記載通り、全ての模擬試験は実施していません。応用レベルは結構しんどいと思いますが、実際の試験的には基礎レベル以上応用レベル以下といった感じなので頑張りましょう。間違えた問題、正解した問題のトピックをテキストに戻って確認し、そこに記載されている細かいトピックを拾っていきましょう。徐々に知識に厚みが出てきます。

合格

参考として、上記実施後に試験を受けた結果のキャプチャを載せます。

合格点

終わりに

学習期間を約1か月と記載しましたが、あくまでも目安です。ご自身の環境(知識のバッググラウンド、学習に取れる時間など)によって変動する事は当たり前ですので、焦らずじっくりと学習し資格取得を目指しましょう。取得できるまで知識をつければAWSと仲良くなれた気がしますよ。良きAWSライフを!

はてなブログでコマンドやコードを綺麗に載せる方法

はじめに

はてなブログ記事作成の練習として、コマンドやコードを記事に綺麗に載せる方法を書きます。

結論ファースト

文字列を「>|| 文字列 ||<」の様に記載する。

「>|| echo "Hello World" ||<」を囲ってみると以下の様になります。

echo "Hello World"

編集画面では下図の様に囲います。

f:id:ariesmerino:20210506021902p:plain
編集画面の記法

注意点

・>||や||<を記載する際にスペースをあけない
・>||と||<はそれぞれ一行に記載し、その間にコマンドやコードを記載する
・編集モードを「はてな記法」に設定


はてなブログ Perfect GuideBook [改訂第2版]

はてなブログ Perfect GuideBook [改訂第2版]

  • 作者:JOE AOTO
  • 発売日: 2020/07/18
  • メディア: 単行本