<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>awk &#8211; セキュリティエンジニアの雑多ブログ</title>
	<atom:link href="https://cybermemo.blog/tag/awk/feed" rel="self" type="application/rss+xml" />
	<link>https://cybermemo.blog</link>
	<description>セキュリティエンジニアの学習記録</description>
	<lastBuildDate>Sun, 12 Oct 2025 15:07:28 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://cybermemo.blog/wp-content/uploads/2025/10/cropped-トップアイコン-32x32.jpg</url>
	<title>awk &#8211; セキュリティエンジニアの雑多ブログ</title>
	<link>https://cybermemo.blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>初心者向けawkコマンドの使い方</title>
		<link>https://cybermemo.blog/awk-beginner-guide</link>
					<comments>https://cybermemo.blog/awk-beginner-guide#respond</comments>
		
		<dc:creator><![CDATA[miyuki]]></dc:creator>
		<pubDate>Sun, 12 Oct 2025 15:07:28 +0000</pubDate>
				<category><![CDATA[コマンド]]></category>
		<category><![CDATA[awk]]></category>
		<category><![CDATA[SOC]]></category>
		<category><![CDATA[ログ分析]]></category>
		<guid isPermaLink="false">https://cybermemo.blog/?p=465</guid>

					<description><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>awkコマンドとは awk（オーク）はテキストを1行ずつ読みながら、1行をくつかの列（フィールド）に分けて読む・抜き出す・加工するためのコマンド。たとえば、ログの「3列目だけ取りたい」時にawkが便利。 awkの基本構文 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cybermemo.blog/wp-content/uploads/2025/10/コマンド用アイキャッチ.jpg" class="webfeedsFeaturedVisual" /></p>
<h2 class="wp-block-heading">awkコマンドとは</h2>



<p>awk（オーク）はテキストを1行ずつ読みながら、1行をくつかの列（フィールド）に分けて読む・抜き出す・加工するためのコマンド。<br>たとえば、ログの「3列目だけ取りたい」時にawkが便利。</p>



<h2 class="wp-block-heading">awkの基本構文</h2>



<p>awk の基本構文は以下。</p>



<pre class="wp-block-code"><code>awk 'パターン { アクション }' ファイル名</code></pre>



<p>パターン＝どんな行を選ぶか<br>アクション＝その行で何をするか<br><br>ざっくり言うと 「ファイルの中で、〇〇な行があったら、△△をする」。</p>



<h2 class="wp-block-heading">awkの基本をサンプルから覚える</h2>



<h3 class="wp-block-heading">サンプル</h3>



<p>サンプルとして使用するファイルの内容。<br>各行は「名前・年齢・都市・職業」の4つのフィールドで構成されている。</p>



<pre class="wp-block-code"><code># sample.txt
Alice   25  Tokyo     Engineer
Bob     30  Osaka     Manager
Charlie 28  Nagoya    Designer
David   35  Fukuoka   Engineer
Eve     22  Tokyo     Intern</code></pre>



<h3 class="wp-block-heading">サンプルファイルの分解</h3>



<p>タブやスペースごとに awk が自動で以下表のように読み込んでくれる。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>フィールド番号</th><th>内容（意味）</th><th>awkで書くと</th></tr></thead><tbody><tr><td><code>$1</code></td><td>名前（Name）</td><td>Alice</td></tr><tr><td><code>$2</code></td><td>年齢（Age）</td><td>25</td></tr><tr><td><code>$3</code></td><td>都市（City）</td><td>Tokyo</td></tr><tr><td><code>$4</code></td><td>職業（Job）</td><td>Engineer</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">実際に動かしてみる</h3>



<h4 class="wp-block-heading">行全体を表示</h4>



<p>print で出力し、$0 でその行全体（すべてのフィールド）を指定。</p>



<pre class="wp-block-code"><code>$ awk '{print $0}' sample.txt</code></pre>



<p>ファイル全体を見たいなら cat でいい気がするので、実務では使わないかも。</p>



<pre class="wp-block-code"><code># sample.txt
Alice   25  Tokyo     Engineer
Bob     30  Osaka     Manager
Charlie 28  Nagoya    Designer
David   35  Fukuoka   Engineer
Eve     22  Tokyo     Intern</code></pre>



<h4 class="wp-block-heading">1列目（名前）だけ表示</h4>



<p>$1 で名前フィールドを出力。</p>



<pre class="wp-block-code"><code>$ awk '{print $1}' sample.txt</code></pre>



<p>これだけだとコメント（#）まで出力されてしまうので、実務ではもう少し条件を絞った方がよさそう。</p>



<pre class="wp-block-code"><code>#
Alice
Bob
Charlie
David
Eve</code></pre>



<h4 class="wp-block-heading">コメント（#）を除外</h4>



<p>! = ～でない、/文字列/ = 正規表現の始まりと終わりを示す囲み記号、^ = 先頭行 の意味。 <br>先頭行がコメント（#）でない名前フィールドを出力。</p>



<pre class="wp-block-code"><code>$ awk '!/^#/ {print $1}' sample.txt</code></pre>



<p>コメント（#）が除外され、名前のフィールドだけが出力される。</p>



<pre class="wp-block-code"><code>Alice
Bob
Charlie
David
Eve</code></pre>



<h4 class="wp-block-heading">名前と都市を表示</h4>



<p>$1 で名前フィールド、$3 で都市フィールドを指定。</p>



<pre class="wp-block-code"><code>$ awk '{print $1, $3}' sample.txt</code></pre>



<p>それぞれのフィールドが正しく抽出されている。</p>



<pre class="wp-block-code"><code># 
Alice Tokyo
Bob Osaka
Charlie Nagoya
David Fukuoka
Eve Tokyo</code></pre>



<h4 class="wp-block-heading">Tokyo に住んでいる人だけ表示</h4>



<p>$3 を == で Tokyo 指定。</p>



<pre class="wp-block-code"><code>$ awk '$3 == "Tokyo" {print $0}' sample.txt</code></pre>



<p>Tokyo に住んでいる人だけが抽出される。</p>



<pre class="wp-block-code"><code>Alice   25  Tokyo     Engineer
Eve     22  Tokyo     Intern</code></pre>



<h4 class="wp-block-heading">年齢が30歳以上の人だけ表示</h4>



<p>$2 >= 30 で指定。ついでにコメントも &amp;&amp; でつなげて除外しておく。</p>



<pre class="wp-block-code"><code>$ awk '!/^#/ &amp;&amp; $2 >= 30 {print $1, $2}' sample.txt</code></pre>



<p>30歳以上の人だけが抽出される。</p>



<pre class="wp-block-code"><code>Bob 30
David 35</code></pre>



<h4 class="wp-block-heading">Engineerの人数を数える</h4>



<p>$4 == &#8220;Engineer&#8221; で エンジニアを指定、{count++} で条件が真なら count を 1 増やす、END {print count} でファイルを全部読み終わったあとに出力。</p>



<pre class="wp-block-code"><code>$ awk '$4 == "Engineer" {count++} END {print count}' sample.txt</code></pre>



<p>きちんとカウントされている。</p>



<pre class="wp-block-code"><code>2</code></pre>



<h4 class="wp-block-heading">平均年齢を計算</h4>



<p>{sum += $2; count++} で 2 列目（年齢）の値を合計し、行数を 1 増やす。<br>END {print sum/count} でファイルをすべて読み終えたあとに平均を出力する。<br>※今回はカウント処理を行うため、コメント（#）のスキップが必須。<br><br>; は改行と同じ意味。</p>



<pre class="wp-block-code"><code>$ awk '!/^#/ {sum += $2; count++} END {print sum/count}' sample.txt</code></pre>



<p>平均年齢が出力される。</p>



<pre class="wp-block-code"><code>28</code></pre>



<p>このコマンドの動きは以下の通り。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>行</th><th>$2（年齢）</th><th>条件 <code>!/^#/</code></th><th>sumの値</th><th>countの値</th></tr></thead><tbody><tr><td># sample.txt</td><td>&#8211;</td><td>False</td><td>0</td><td>0</td></tr><tr><td>Alice 25 Tokyo Engineer</td><td>25</td><td>True</td><td>25</td><td>1</td></tr><tr><td>Bob 30 Osaka Manager</td><td>30</td><td>True</td><td>55</td><td>2</td></tr><tr><td>Charlie 28 Nagoya Designer</td><td>28</td><td>True</td><td>83</td><td>3</td></tr><tr><td>David 35 Fukuoka Engineer</td><td>35</td><td>True</td><td>118</td><td>4</td></tr><tr><td>Eve 22 Tokyo Intern</td><td>22</td><td>True</td><td>140</td><td>5</td></tr></tbody></table></figure>



<h4 class="wp-block-heading">都市ごとの人数を集計</h4>



<p>{city[$3]++} で 3 列目（都市名）をキーとしてカウントする。<br>END { … } はファイルをすべて読み終えたあとに 1 回だけ実行される処理。<br>for (c in city) ですべての都市（キー）を順に処理し、<br>print c, city[c] で都市名と人数を出力する。<br>※今回はカウントをしているのでコメントのスキップは必須。</p>



<pre class="wp-block-code"><code>$ awk '!/^#/ {city&#91;$3]++} END {for (c in city) print c, city&#91;c]}' sample.txt </code></pre>



<p>都市ごとの人数が出力される。</p>



<pre class="wp-block-code"><code>Osaka 1
Fukuoka 1
Nagoya 1
Tokyo 2</code></pre>



<p>このコマンドの動きは以下の通り。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>行</th><th>$3（都市）</th><th>条件 !/^#/</th><th>city[$3] の動作</th><th>city配列の内容（内部状態）</th></tr></thead><tbody><tr><td># sample.txt</td><td>―</td><td>False</td><td>実行されない</td><td>（何もない）</td></tr><tr><td>Alice 25 Tokyo Engineer</td><td>Tokyo</td><td>True</td><td><code>city["Tokyo"]++</code> → 1</td><td>Tokyo:1</td></tr><tr><td>Bob 30 Osaka Manager</td><td>Osaka</td><td>True</td><td><code>city["Osaka"]++</code> → 1</td><td>Tokyo:1, Osaka:1</td></tr><tr><td>Charlie 28 Nagoya Designer</td><td>Nagoya</td><td>True</td><td><code>city["Nagoya"]++</code> → 1</td><td>Tokyo:1, Osaka:1, Nagoya:1</td></tr><tr><td>David 35 Fukuoka Engineer</td><td>Fukuoka</td><td>True</td><td><code>city["Fukuoka"]++</code> → 1</td><td>Tokyo:1, Osaka:1, Nagoya:1, Fukuoka:1</td></tr><tr><td>Eve 22 Tokyo Intern</td><td>Tokyo</td><td>True</td><td><code>city["Tokyo"]++</code> → 2</td><td>Tokyo:2, Osaka:1, Nagoya:1, Fukuoka:1</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">疑問に思ったこと</h2>



<h3 class="wp-block-heading">文章ベースのファイルにはawkコマンドは使えないのか</h3>



<p>たとえば、</p>



<pre class="wp-block-code"><code>Aliceは東京で働いています。
Bobは大阪に住んでいます。
Charlieは28歳です。</code></pre>



<p>という文章ファイルがあった場合、awk の使いどころがあるのか気になった。</p>



<p>awk の動きとしては「スペースやタブで明確に区切られていない」文章だと、</p>



<pre class="wp-block-code"><code>$1 Aliceは東京で働いています。
$1 Bobは大阪に住んでいます。
$1 Charlieは28歳です。</code></pre>



<p>となり、すべて $1 になるのでフィールド分けができず、awk の長所は活かせない。</p>



<p>一応、grep のように抽出することは可能。</p>



<pre class="wp-block-code"><code>$ awk '/東京/ {print $0}' sample_text.txt
Aliceは東京で働いています。

$ awk '/&#91;0-9]+歳/ {print $0}' sample_text.txt
Charlieは28歳です。</code></pre>



<p>行番号を付けることもできる。</p>



<pre class="wp-block-code"><code>$ awk '{print NR, $0}' sample_text.txt
1 Aliceは東京で働いています。
2 Bobは大阪に住んでいます。
3 Charlieは28歳です。</code></pre>



<p>結論としては、awk でも文章ファイルの操作はある程度できるけど、本来の用途とは離れており、わざわざ awk で文章ファイルを操作する必要はなさそう。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cybermemo.blog/awk-beginner-guide/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
