------------------------------------------------------------------------------- $ 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せよ! ということです。