📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
ページの作成:「== 概要 == <code>awk</code>コマンドとは、入力として受け取った文字列に対して、フィールド区切り文字やレコード区切り文字を指…」 |
|||
| (同じ利用者による、間の9版が非表示) | |||
| 2行目: | 2行目: | ||
<code>awk</code>コマンドとは、入力として受け取った文字列に対して、フィールド区切り文字やレコード区切り文字を指定して、<br> | <code>awk</code>コマンドとは、入力として受け取った文字列に対して、フィールド区切り文字やレコード区切り文字を指定して、<br> | ||
列に対する処理を行うためのコマンドである。<br> | 列に対する処理を行うためのコマンドである。<br> | ||
<br><br> | |||
== awkのインストール == | |||
==== パッケージ管理システムからインストール ==== | |||
多くのLinuxディストリビューションでは、パッケージ管理システムからgawkをインストールすることができる。<br> | |||
sudo zypper install gawk | |||
<br> | |||
==== ソースコードからインストール ==== | |||
もし、別途インストールする必要がある場合、ソースコードからgawkをインストールする。<br> | |||
<br> | |||
gawkのビルドに必要なライブラリをインストールする。<br> | |||
sudo zypper install mpfr-devel readline-devel gettext-runtime gettext-tools intltool libsigsegv-devel | |||
<br> | |||
[https://www.gnu.org/software/gawk/ GNUソフトウェアの公式Webサイト]にアクセスして、ソースコードをダウンロードする。<br> | |||
ダウンロードしたファイルを解凍する。<br> | |||
tar xf gawk-<バージョン>.tar.xz | |||
cd gawk-<バージョン> | |||
<br> | |||
gawkをビルドおよびインストールする。<br> | |||
mkdir build && cd build | |||
../configure --prefix=<gawkのインストールディレクトリ> | |||
make -j $(nproc) | |||
make install | |||
<br> | |||
gawkの実行に必要な依存関係のライブラリをインストールする。<br> | |||
sudo zypper install libsigsegv2 | |||
<br> | |||
~/.profileファイル等に、環境変数PATHを追記する。<br> | |||
vi ~/.profile | |||
<br> | |||
# ~/.profileファイル | |||
export PATH="/<gawkのインストールディレクトリ>/bin:$PATH" | |||
export LD_LIBRARY_PATH="/<gawkのインストールディレクトリ>/lib64:/<gawkのインストールディレクトリ>/lib:$LD_LIBRARY_PATH" | |||
<br><br> | <br><br> | ||
| 66行目: | 101行目: | ||
1 2 | 1 2 | ||
<br><br> | <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> | |||
{{#seo: | |||
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki | |||
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 | |||
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux | |||
|image=/resources/assets/MochiuLogo_Single_Blue.png | |||
}} | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ: | [[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]][[カテゴリ:PinePhone]] | ||