MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Linuxコマンド - awkのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Linuxコマンド - awk
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == <code>awk</code>コマンドとは、入力として受け取った文字列に対して、フィールド区切り文字やレコード区切り文字を指定して、<br> 列に対する処理を行うためのコマンドである。<br> <br><br> == awkコマンドの基本書式 == <code>awk</code>コマンドの基本書式を以下に記載する。<br> awk -F'[フィールド区切り文字(複数可能)]' -v '変数=xx' '{awkコマンド}' file <br><br> == フィールドの出力 == 標準出力を行う<code>awk</code>コマンドの<code>print</code>を使用して、<code>awk</code>コマンドで指定したフィールドを取得する。<br> <code>-F'[フィールド区切り文字]'</code>オプションを指定しない場合、区切り文字にはタブまたは半角スペースが選択される。<br> <br> ==== 1フィールド目を出力 : print $1 ==== # 実行 echo 1 2 3 4 | awk '{print $1}' # 出力 1 <br> ==== 2フィールド目の出力 : print $2 ==== # 実行 echo 1 2 3 4 | awk '{print $2}' # 出力 2 <br> ==== 全ての文字列の出力 : print $0 または print ==== # 実行 echo 1 2 3 4 | awk '{print $0}' # 出力 1 2 3 4 <br> # 実行 echo 1 2 3 4 | awk '{print}' # 出力 1 2 3 4 <br> ==== フィールド区切り文字の指定 ==== フィールド区切り文字として、":"を指定する。<br> # 実行 echo 1:2:3:4 | awk -F'[:]' '{print $1}' # 出力 1 <br> また、フィールド区切り文字は複数指定できる。<br> <br> 以下の例では、フィールド区切り文字として、":"と"/"を指定している。<br> 並べて記述することで、":"と"/"がフィールド区切り文字として扱われる。<br> # 実行 echo 1:2/3:4 | awk -F'[:/]' '{print $3}' # 出力 3 <br> 複数フィールドの出力は、半角スペースで区切られる。(OFSを指定していないため)<br> OFSについては、後述のセクションを参照すること。<br> # 実行 echo 1:2/3:4 | awk -F'[:/]' '{print $1,$2}' # 出力 1 2 <br><br> == OFS == <code>OFS</code>(Output Field Separator)とは、awkコマンドの組み込み変数であり、出力のフィールド区切り文字を指定する。<br> <code>-v</code>オプションは、変数(variable)を指定するという意味のオプションである。<br> -v '変数=xx' <br> 以下の例では、OFSに半角スペースを指定して、フィールドの出力を#で区切る。<br> # 実行 echo 1:2/3:4 | awk -F'[:/]' -v 'OFS= ' '{print $1,$3}' # 出力 1 3 <br><br> == RS == <code>RS</code>(Record Separator)とは、awkコマンドの組み込み変数であり、入力のレコード区切り文字を指定する。<br> <br> 以下の例では、/を区切り文字に指定して、1:2と3:4に分けている。<br> /をレコード区切り文字にして、各レコードから1フィールド目を取得している。<br> 出力は、改行で区切って出力される。(ORSが指定されていないため)<br> # 実行 echo 1:2/3:4 | awk -F'[:]' -v 'RS=/' '{print $1}' # 出力 1 3 <br> # 実行 echo 1:2/3:4 | awk -F'[:]' -v 'RS=/' '{print $1,$2}' # 出力 1 2 3 4 <br> フィールド区切り文字とレコード区切り文字で同じ文字がある場合、レコード区切り文字が優先される。<br> # 実行 echo 1:2/3:4 | awk -F'[:/]' -v 'RS=/' '{print $1,$2}' # 出力 1 2 3 4 <br><br> == ORS == <code>ORS</code>(Output Record Separator)とは、awkコマンドの組み込み変数であり、出力のレコード区切り文字を指定する。<br> <br> 以下の例では、"This is ORS"を指定して、レコードの出力を区切っている。<br> # 実行 echo 1:2/3:4 | awk -F'[:/]' -v 'RS=/' -v 'ORS=This is ORS' '{print $1,$2}' # 出力 1 2This is ORS3 4 <br><br> == OFSとORSの明示 == 以下の例では、OFSは空白4つ、ORSは改行2つにしている。<br> また、\nは改行を示す。<br> # 実行 echo 1:2/3:4 | awk -F'[:/]' -v 'OFS= ' -v 'RS=/' -v 'ORS=\n\n' '{print $1,$2}' # 出力 1 2 3 4 <br><br> == 最終フィールドの取得 : $NF == 最終フィールドを取得するとして、$NFが用意されている。<br> # 実行 echo 1:2/3:4 | awk -F'[:/]' '{print $NF}' # 出力 4 <br> # 実行 echo 1:2/3:4 | awk -F'[:/]' '{print $NF-1}' # 出力 3 <br><br> == printf == printの他に、printfも使用できる。<br> # 実行 echo 1:2/3:4 | awk -F'[:/]' '{printf "%s\n%s\n",$NF,$NF-1}' # 出力 4 3 <br><br> == awkを使用したフィルタリング == ==== 空白で区切られた特定のフィールドを切り出す ==== <code>awk</code>の組み込み変数<code>$x</code>には、xフィールド目に存在する文字列が設定されている。<br> これを、<code>awk</code>の<code>print</code>文で出力することにより、特定のフィールドのみを切り出すことができる。<br> <br> <code>cut</code>コマンドでも空白区切りのフィールドを切り出すことが可能だが、特に、フィールド間の空白数が一定でない場合は<code>awk</code>コマンドを使用する。<br> 一定の空白数の有無に関わらず、空白区切りのフィールドを切り出すには、<code>awk</code>コマンドを使用した方がよい。<br> awk '{ print $フィールド番号 }' # awkコマンドの組み込み変数で対象フィールドのみを出力する <br> 以下の例では、特定のフィールドを切り出している。<br> cat test.txt 111 ABC abc 222 DEF def 333 GHI ghi 444 JKL jkl 555 MNO mno 666 PQR pqr 777 STU stu 888 VWX vwx 999 YZ yz <br> 1フィールド目を切り出す。<br> awk '{ print $1 }' test.txt 111 222 333 444 555 666 777 888 999 <br> 2フィールド目を切り出す。<br> awk '{ print $2 }' test.txt ABC DEF GHI JKL MNO PQR STU VWX YZ <br> 3フィールド目を切り出す。<br> awk '{ print $3 }' awktest.txt abc def ghi jkl mno pqr stu vwx yz <br> 対象となる行を特定してフィールドを切り出す。<br> <br> 行番号を指定することで、処理対象となる範囲を限定することができる。<br> また、行番号指定の場合は、<code>==</code>以外にも、<code><</code>、<code>></code>、<code><=</code>、<code>>=</code>、<code>!=</code>が使用できる。<br> さらに、<code>||</code>(OR条件)や<code>&&</code>(AND条件)で複数の条件を指定することもできる。<br> <br> <code>NR</code>は行番号を表すawkコマンドの組み込み変数である。<br> awk '(NR == 行番号){ print $フィールド番号 }' # awkコマンドに処理対象とする行番号を指定する <br> 1行目のみを処理対象とする。<br> awk '(NR == 1){ print $1 }' test.txt 111 <br> 1行目および9行目を処理対象とする。<br> awk '(NR == 1 || NR == 9){ print $1 }' test.txt 111 999 <br> 5行目を超えて8行目以下、つまり、6行目から8行目までの行を処理対象とする。<br> awk '(NR > 5 && NR <= 8){ print $1 }' test.txt 666 777 888 <br> ==== 空白で区切られたフィールドの順番を入れ替える ==== "hoge fuga foo bar"のように空白で区切られた各フィールドを、"bar hoge bar foo"のように順番を入れ替えて出力するには、<code>awk</code>コマンドを使用する。<br> <br> <code>awk</code>コマンドにおいて、$xはx番目のフィールドを意味する。<br> つまり、フィールドの順番を入れ替えるには、出力したい順番で$xを指定する。<br> <br> 例えば、3つのフィールドの順番を逆にする場合は、<code>$3" "$2" "$1</code>と指定する。<br> <code>" "</code>は、フィールド間のスペースを意味するため、これを指定せずに実行すると、各フィールドが結合した状態で出力されてしまう。<br> awk '{ print $フィールド番号" "$フィールド番号" "..." "$フィールド番号 }' # awkコマンドで各フィールドの番号を出力したい順に指定する <br> cat shuffle.txt 111 ABC abc 222 DEF def 333 GHI ghi 444 JKL jkl 555 MNO mno <br> 以下の例では、空白スペース" "を指定していないため、全て結合された状態で出力されている。<br> awk '{ print $3 $1 $2 }' shuffle.txt abc111ABC def222DEF ghi333GHI jkl444JKL mno555MNO <br> 以下の例では、$xの間に" "を指定しているため、フィールド間がスペースで区切られている。<br> awk '{ print $3" "$1" "$2 }' shuffle.txt abc 111 ABC def 222 DEF ghi 333 GHI jkl 444 JKL mno 555 MNO <br> 以下の例では、同じフィールドを2回出力している。<br> awk '{ print $3" "$1" "$1" "$2 }' shuffle.txt abc 111 111 ABC def 222 222 DEF ghi 333 333 GHI jkl 444 444 JKL mno 555 555 MNO <br> シェルスクリプトに組み込んで使用する場合は、以下のように、パイプでデータを引き渡して実行することが多い。<br> 以下の例でのように、処理対象データから予め不要な部分を取り除いた上でawkに引き渡すことで、awkを簡素に記述することができる。<br> head -n 3 shuffle.txt | awk '{ print $2 }' ABC DEF GHI <br> <u>※備考</u><br> <u>awkはコマンドではなく、インタプリタでありシェルスクリプトとは異なるスクリプト言語である。</u><br> <u>元々、テキスト処理のために開発されたスクリプト言語であるため、シェルスクリプトよりも高速にテキスト処理を行うことができる。</u><br> <br> <u>awkはシェルスクリプトに組み込むことが容易であるため、awkのみで使用するよりもシェルスクリプト内でフィルタとして使用されることが多い。</u><br> <u>シェルスクリプトで行数の多いテキストファイルを処理する場合、一部にawkを使用することで高速なプログラムを記述することができる。</u><br> <br> <u>テキストファイルの処理にはPerl等を使用した方が便利な場合もあるが、Perl等が使用できない環境ではawkを使用する方がよい。</u><br> <br><br> __FORCETOC__ [[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]]
Linuxコマンド - awk
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse