2007年8月20日月曜日
愚痴 - Solaris の awk ってさぁ

ワケあって、シコシコと他人が作ったスクリプトを弄くりまわしてるんだけどさ。
これがまた、Solarisのawkがムッチャクチャ使えねー。

いや、nawkとか使えばいいって話なんだけどさ。

今回はそういうワケにもいかない理由があってさ。


しかし、Solarisのawkがここまで使えないなら、いっそのことawkをnawkのシンボリックリンクとかエイリアスで解決できそうなもんだけど…とか思わなくもないんだけど、そういうワケにもいかないか。

なんで正規表現が使えないんだろうね。

で、やりたかったことってのは、ファイルからパスリストを引っ張って…

まず、整形する。
末尾のスペースを削除する。んで、パスなので、末尾に"/"があったら削除する。
ここで gsub() を使って、" +$"を" "に置換する…

gsub(検索文字列, 置換文字列, 検索対象文字列);


…んだけど、Solarisってgsub()ないんね。
しかたないんで sed を使って置換する。
まぁ、こんなカンジ。

sed 's/[ ]*$//g'

あ、でもこれだと、文字列じゃなくって、ファイルを読み込むって手順になるねぇ。


さて、取得したパスが、期待するパスかどうかをチェックする…

で、match()を使って(文字通り)マッチするかどうか確認するんだけど

match(対象文字列, 探したい文字列);

マッチした場合、その開始位置(1から始まる)を返す。

…Solarisじゃmatch()使えないんだね。

で、同じ機能のindex()を使ってみる…んだけど、正規表現が使えない。
マァ仕様的に、検索したいパスが固定できるなら、index()に置き換えて、新しいロジックを考えなくていいからと上司に確認してみると…

「確認しとくから」と言いながら放置プレイ。

挙句に「出来た?」なんてぬかしやがる。

どうやら正規表現は必須なようなので、index()は不可。
文字列が含まれるかどうかって話なんで、system()を使ってgrepさせようか?
すでにawkスクリプトの範疇を超え始めてるな。
gsub()を外してsedにして、挙句に処理をsystem()で外部的に処理をさせるって…

ってことで、whileを使って、ファイルを一行ずつ読み込む

while read LINE
do

done < $1


…と。
で、変数LINEに読み込んだものをチェックするのは case でいいかな?

while read LINE
do
case $LINE
in
/path/*/path*)
(処理)
;;
*)
(処理)
;;
esac
done < $1

んんー… ダサイなぁ。

愚痴愚痴。


おっと、忘れてたので追記。
文字列比較って、"~"(チルダ)でもできるんだね。

if( 文字列A ~ 文字列B ){
処理
}


と、こんなカンジ。
これもSolarisのawkじゃNGでした。




元記事
HOMEGROWN | 愚痴 - Solaris の awk ってさぁ。
http://homegrown.jugem.cc/?eid=206



0 コメント | コメントを書く
Template Design: © 2007 Envy Inc.