csh 入門 ---- awk や sed の便利な部分を使う。

awk や sed は、それ自身で簡単なスクリプトが作れる言語です。 これを理解すれば、csh スクリプトを同じコマンドをつくることが できます。ここでは、awk や sed の機能を一部使ってみましょう。 これができると、かゆい処に手が届くようなことができるようにな ります。かゆいところに手を届くには、ここの説明では不十分なこ とをあらかじめ御了承ください。 ここでは極簡単な使用例をしめします。

5.1 awk で何番目のデータをとる。nanban

unix の コマンドを実行してそこから 必要なデータだけを取り出 し使うことは良くあります。例えば %ls -l を実行すると、
ami.ee.uec.ac.jp56% ls -l
total 75
-rw-r--r--   1 rsaito   bin          4101 Jul  6 22:44 #awk.html#
-rwxr-xr-x   1 rsaito   bin           125 Jul  3 22:12 2e*
-rw-r--r--   1 rsaito   bin          3744 Jul  6 22:43 awk.html
-rw-r--r--   1 rsaito   bin          3878 Jul  6 22:39 awk.html~
-rwxr-xr-x   1 rsaito   bin           641 Jul  5 23:17 file*
-rw-r--r--   1 rsaito   bin          3816 Jul  6 22:38 file.html
-rw-r--r--   1 rsaito   bin          3878 Jul  6 22:34 file.html~
-rw-r--r--   1 rsaito   bin          2125 Jul  6 22:30 foreach.html
とでて来ますが、ここで 1 番目と 3 番目と 5 番目だけ欲しい場 合には、
% ls -l | awk '{printf "%s %s %s\n",$1,$3,$5}'
total  
-rw-r--r-- rsaito 4805
-rwxr-xr-x rsaito 125
-rw-r--r-- rsaito 3744
-rw-r--r-- rsaito 3878
-rwxr-xr-x rsaito 641
-rw-r--r-- rsaito 3816
-rw-r--r-- rsaito 3878
-rw-r--r-- rsaito 2125
ここで printf は c 言語と同じ関数の形をしています。awk ' {print $1,$3,$5}' でもok です。このようにして、必要な部分だ けを取り出します。これを set や foreach でで 変数に代入すれ ば ok です。詳しい awk の使いかたは、man awk や awk を解説し た本を読んでみてください。 perl でもおなじことができます。 次の例は、ある directory の中の *.c または *.h という file のなかに 特定の 言葉 $argv があるかどうかを調べます。これは c 言語でかかれた ライブラリの中から必要な file を探すときに 便利です。
#!/bin/csh
foreach i(`/bin/ls *.c *.h`)
set ss = `grep $argv $i | wc | awk '{print $1}'`
if ($ss > 0) then
echo "****" $i "****"
grep $argv $i
endif
end
echo fa: nomal end.

ここで grep は $i から $argv の 文字のある行を抜きだします。 wc はその行数文字数等を出力します。awk で その 1 番目 のデータである行数を出力します。これを ss に代入します。 もし $argv の文字があれば ss > 0 ですから、その場合には、 file 名とその行をもう一度表示することにします。tex directory では *.c を *.tex にします。試してみてください。

5.2 sed を使う。

sed は、先頭の文字をとったり、file の中のある行からある行ま でを取り出したりするのに便利なコマンドです。使いかたは、 具体例をみるのが一番です。
# 文字の置換は sed で s/aaa/bbb/g でできます。
cat file | sed -e 's/kaerumae/kaetaato/g' 
# sed では 行の先頭は ^ で表します。
# 以下は file の中で、start から end までを切り取ります。
sed -n '/^   start sentence/,/^    end sentence/p' file
# awk でも ok です。
awk  /start/,/end/ < file >! kekka
sed をもっと詳しく説明したいところですが、まず上を試して見て ください。パイプ | を駆使すると、結構いろいろなことができま す。sed に興味をもったら、sed の 具体例を作って私に送ってく ださい。登録します。

もっと細かいことがしたいとなると、perl のおでましです。 perl は、network 上の interface をも持っていますから、強力で す。ほとんどの場合、csh で スクリプトを作るより perl で作っ た方が実行速度も早いです。もし興味をもったら perl も勉強して みてください。


rsaito@ee.uec.ac.jp