------------------------------------------------------------------------------- $ ps -ef | grep hashi hashi 6848 6687 0 12:18:22 pts/2 0:00 vi /doc/md5.html hashi 6687 6685 0 11:10:31 pts/2 0:00 -bash hashi 6680 6678 0 11:01:31 pts/1 0:00 -bash -------------------------------------------------------------------------------※1番目はユーザID、2番目はプロセスID、3番目は親プロセスID…です。
-------------------------------------------------------------------------------
$ ps -ef | grep hashi | awk '{print ">>" $2 "<<"}'
>>6848<<
>>6687<<
>>6680<<
-------------------------------------------------------------------------------
要するに、行で、一個以上のスペース(またはタブ)で区切られた文字列の1番目、2番目、…を それぞれ $1、$2、…で参照できるのです。
これだけでもすっごく便利でしょう?
-------------------------------------------------------------------------------
$ ps -ef | grep hashi | awk '{print "kill -9 " $2}' | sh
-------------------------------------------------------------------------------
※自分の全てのプロセスがkillされます。危険!
-------------------------------------------------------------------------------
$ ps -ef | grep hashi | awk 'BEGIN{print "♪橋村のプロセス番号一覧"}{print $2}END{print "以上。"}'
♪橋村のプロセス番号一覧
6848
6687
6680
以上。
-------------------------------------------------------------------------------
BEGIN{...} は、後述する変数の初期化とかに、END{...} は処理結果を報告したりに使えます。------------------------------------------------------------------------------- $ cat topdomain5.txt com,12140747,15479017,3338270,868016,5993551,Commercial net,8856687,9383201,526514,64423,2926036,Networks edu,5022815,5228251,205436,3600,1678553,Educational jp,1687534,1718935,31401,97,38979,Japan us,1562391,1642418,80027,75,3118,United States -------------------------------------------------------------------------------このファイルから、“com is Commercial” のように、“最初の文字列 is 最後の文字列” と表示するには
--------------------------
$ awk -F, '{print $1 " is " $7}' topdomain5.txt
com is Commercial
net is Networks
edu is Educational
jp is Japan
us is United States
--------------------------
見事、カンマで認識されています。
{a=5; print a;}
(※命令を複数書く場合は、セミコロン ; で区切ります)
{a=5; print $a;}
とすると、毎行の5番目の文字列(=$5)という意味になってしまいます。------------------------------------------------------------------------------- $ ls -alp | grep -v / 合計 14 -rw-r--r-- 1 hashi users 2251 3月 2日 14:49 form.c -rw-r--r-- 1 hashi users 601 3月 2日 13:34 tmp.c -------------------------------------------------------------------------------※lsコマンドの “-p” オプションは、ファイルがディレクトリの場合、'/' を名前の末尾に付けるもので、また、その次に grepコマンドの “-v” で、'/' の見つかった行を除外します。
-------------------------------------------------------------------------------
$ ls -alp | grep -v / | awk '{capa+=$5}END{capa/=1024; print "total=" capa "Kbyte";}'
total=2.78516Kbyte
-------------------------------------------------------------------------------
毎行のファイルサイズを 変数capaにためていき、終わりに÷1024して表示しています。------------------------------------------------------------------------------- $ cat /etc/hosts 127.0.0.1 localhost 192.168.1.1 jisaku1.myhome.or.jp jisaku1 192.168.1.2 ok_vaio 192.168.1.3 fmv5120d5.myhome.or.jp fmv5120d5 192.168.1.4 fmv466d3 -------------------------------------------------------------------------------各行の NF を見てみます。
-------------------------------------------------------------------------------
$ awk '{print NF}' /etc/hosts
2
3
2
3
2
-------------------------------------------------------------------------------
テクの1つとして、NFに$をつけると…
-------------------------------------------------------------------------------
$ awk '{print $NF}' /etc/hosts
localhost
jisaku1
ok_vaio
fmv5120d5
fmv466d3
-------------------------------------------------------------------------------
行によってフィールド数がまちまちでも、うまい具合に最後の文字列が取れます。if(条件式){...}else if(条件式){...}else{...}
------------------------------------------------------------------------------- $ cat px.lst wyrm.its.uow.edu.au:8080 xanadu.centrum.dk:8080 xcs.contex.com:80 xena.cable-lynx.net:3128 xmail.eatel.com:8080 xns.codify.com.tw:3128 xxcal-labs.com:8080 yellow.javanet.com:80 yogsothoth.ludexpress.com:8080 yourpalsat.netmeg.net:3128 zam381.zam.kfa-juelich.de:3128 zenith000.hhs.net:80 -------------------------------------------------------------------------------何のリストかはともかく、どうも “ドメイン名:ポート番号” という形式をしているようです。
-------------------------------------------------------------------------------
$ awk -F: '{if(($2==80)||($2==3128)){print $1}}' px.lst
xcs.contex.com
xena.cable-lynx.net
xns.codify.com.tw
yellow.javanet.com
yourpalsat.netmeg.net
zam381.zam.kfa-juelich.de
zenith000.hhs.net
-------------------------------------------------------------------------------
この例のような場合、もっと簡単に
条件式{...}
とも書くことができます。
-------------------------------------------------------------------------------
$ awk -F: '$2==80||$2==3128{print $1}' px.lst
-------------------------------------------------------------------------------
/パターン/{...}
とすればOKです。
-------------------------------------------------------------------------------
$ awk -F: '/\.(net|de)/{print $1}' px.lst
xena.cable-lynx.net
yourpalsat.netmeg.net
zam381.zam.kfa-juelich.de
zenith000.hhs.net
-------------------------------------------------------------------------------
※パターンの所のドット . に \ を付けないと、ドットが「任意の1文字に合致する」という意味になってしまいます。$1 ~ /パターン/{...}
のように書くと、$1 に限定されます。
1つ前の例は、
-------------------------------------------------------------------------------
$ awk -F: '$1 ~ /\.(net|de)/{print $1}' px.lst
-------------------------------------------------------------------------------
と書いた方がより親切でしょう。$1 !~ /パターン/{...}
のように、チルダ ~ の前に ! を付けます。
-------------------------------------------------------------------------------
$ awk -F: '$1 !~ /\.(net|de)/{print $1}' px.lst
wyrm.its.uow.edu.au
xanadu.centrum.dk
xcs.contex.com
xmail.eatel.com
xns.codify.com.tw
xxcal-labs.com
yellow.javanet.com
yogsothoth.ludexpress.com
-------------------------------------------------------------------------------
翻訳すると、1番目の文字列 ($1) に “.net” または “.de” が無い行の 1番目の文字列を printせよ! ということです。