• ベストアンサー

スクリプトの修正お願いします。

================スクリプト内容(sample)===================== #!/bin/sh # ls -l /home/sendfile/ > /tmp/dellist awk '{print $6"\t"$7"\t"$9}' /tmp/dellist > /tmp/list awk -v ARGUMENT="$1" ' BEGIN{ MON=substr(ARGUMENT,1,1) * 10 \ + substr(ARGUMENT,2,1) DAT=substr(ARGUMENT,4,1) * 10 \ + substr(ARGUMENT,5,1) } { echo $MON $DAT if ( "$1" -eq "Jan");then CMON=1 elif ( "$1" -eq "Feb" );then CMON=2 elif ( "%1" -eq "Mar" );then CMON=3 elif ( "%1" -eq "Apr" );then CMON=4 elif ( "$1" -eq "May" );then CMON=5 elif ( "%1" -eq "Jun" );then CMON=6 elif ( "%1" -eq "Jul" );then CMON=7 elif ( "%1" -eq "Aug" );then CMON=8 elif ( "%1" -eq "Sep" );then CMON=9 elif ( "$1" -eq "Oct" );then CMON=10 elif ( "%1" -eq "Nov" );then CMON=11 elif ( "%1" -eq "Dec" );then CMON=12 fi CDAT=substr($2) if [ [ MON > CMON ] || [ ( MON = CMON ) && ( DAT > CDAT ) ] ] {print} }' /tmp/dotFAX/list > /tmp/dotFAX/dellist ================ 実行 ===================== $ sample "08/07/06" ================ 上記の実行結果 ===================== awk: cmd. line:36: fatal: 1 is invalid as number of arguments for substr のようなErrが出ていますが、原因が分かりません。 間違っている箇所や修正お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Lean
  • ベストアンサー率72% (435/603)
回答No.3

awkでプログラミングするなら一度ちゃんと書き方なり、文法なり勉強した方がいいと思いますよ。 以下、2つあるawkの部分の2番目の方だけ、参考程度で。 -------8<-------8<-------8<-------8<-------8<------- awk -v ARGUMENT="$1" ' BEGIN{ MON=substr(ARGUMENT,1,1) * 10 + substr(ARGUMENT,2,1) DAY=substr(ARGUMENT,4,1) * 10 + substr(ARGUMENT,5,1) month["Jan"]=1 ; month["Feb"]=2 ; month["Mar"]=3 ; month["Apr"]=4 ; month["May"]=5 ; month["Jun"]=6 ; month["Jul"]=7 ; month["Aug"]=8 ; month["Sep"]=9 ; month["Oct"]=10 ; month["Nov"]=11 ; month["Dec"]=12 ; } { CMON=month[$1] ; CDAY=$2+0 if ( (MON > CMON) || ((MON == CMON) && (DAY > CDAY)) ) {print} }' /tmp/dotFAX/list > /tmp/dotFAX/dellist -------8<-------8<-------8<-------8<-------8<------- lsの実行結果をawkで加工して/tmp/listというファイルに落としているけど、2番目のawkでは/tmp/listのファイルは使用されていないけどそれであってるの? /tmp/listに入っている内容が2番目のawkの入力となるならlsの実行結果をそのまま2番目のawkの入力にして出力の部分で必要な項目($6,$7,$9)のみ出力するようにすればいいのでは?

その他の回答 (2)

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.2

全面的に間違ってるのでどうしようかなぁ。 awkのプログラムがシェルスクリプトの文法で書いてあります。 -eqとか thenとかelifとかはawkに書いても通用しません。

junho76
質問者

補足

え~~、そうなんですか? どうすればいいのですか? 教えてください!! please~~

  • begin2719
  • ベストアンサー率36% (14/38)
回答No.1

$1と%1混同してません?

junho76
質問者

補足

すみません。うち間違いですが、全部「$1」のことです。 実際のスクリプトはちゃんとなっています。 もう一回確認してください。

関連するQ&A

  • Kシェルでの read line と awk

    お世話になっております。 AIX の 標準 kshell にて下記を実行したいと考えております。 <やりたいこと> recode.txt(逐一別のシェルで内容は変更される) の中身に書かれている文字を参照して、test.txt を読み込んで該当する文字列を読み込みたいと考えています。 test.txt は編集可能なので、誤記入対策の為に、空白/タブ行、先頭空白/タブ、行末空白/タブを無視出来るようにしたいと考えています。 例) recode.txt AAAAA test.txt # ~~コメント~~ # ~~コメント~~ # ~~コメント~~ # ~~コメント~~ <AAAAA> test1 test2 test3 <BBBBB> test10 test11 test12 test13 この場合、結果として、test1、test2、test3を得て、このファイルに対して別のシェルを実行したいと思っております。 recode.txt は read line を使って読み込めるのですが、とりあえずテストとして下記のように test.txt を awk( print $1 で先頭空白、先頭タブが無視されるようでしたので) をつかってみたのですが、上手くいきませんでした。 上手くいかないというよりは、「elif [[ ${jug} == "A" ]]; then」の elif がおかしいと言われ、どうも if ~ の部分がおかしいっぽいのですが……すいません、自分ではどうも原因が分からず困っております。 【test.ksh】 (~省略~) (recode.txt 読み込み処理) jug=X while read line ; do if [[ "`awk '{print $1}' ${line}`" == "#" || "`awk '{print $1}' ${line}`" == "" ]]; then elif [[ ${jug} == "A" ]]; then if [[ `awk '{print $1}' ${line}`" == "<BBBBB>" ]]; then break fi test2.ksh ${line} <エラーチェック> elif [[ ${jug} == "B" ]]; then test3.ksh ${line} <エラーチェック> elif [[ "`awk '{print $1}' ${line}`" == "<AAAAA>" and ${recode} == "AAAAA" ]]; then jug=A elif [[ "`awk '{print $1}' ${line}`" == "<BBBBB>" and ${recode} == "BBBBB" ]]; then jug=B fi done < test.txt (~省略~) $line の扱いが間違っているのか、それとも構文的なところなのか…… orz 本業がSEじゃないのでシェルに詳しくなく申し訳ないのですが、基本的なことと存じますが教えて頂けますと幸いです。 宜しくお願い致します。 ※投稿時に先頭空白が上手く処理されないようで、回避方法が解らず、全て左につめられてしまいまして見難く申し訳ありません。

  • awk外で宣言した変数の参照

    kshを使用して、以下のようなシェルを作成しています。 しかしawk内で$iと$iiが参照出来てない様子です。 どのようにすれば参照できますでしょうか。 ■シェルの中身 #/usr/bin/ksh for i in `cat /tmp/hoge |awk -F : '{ print $3 }' | sort | uniq -d` do if [ $i != "" ]; then for ii in `cat /tmp/hoge` do echo $ii |awk -F ":" '{ if ( $3 -eq $i ) print $ii }' done fi done ■エラー awk: 0602-562 フィールド $() が正しくありません。 入力の行番号は 1 です。 ソースの行番号は 1 です。

  • シェルスクリプト shiftとwhile

    下記の内容はスクリプトの一部を抜粋した内容です。 2箇所、理解が出来ない部分があるので、教えて頂けますでしょうか。 ------------------------------------------------ shift $(( $OPTIND -1)) if [ $# -eq 0 ]; then FileName="" elif [ $# -eq 1 ]; then if [ "\-" = "$1" ]; then FileName="" else FileName="$1" fi else echo "オプションが多い" exit fi if [ "" = "$FileName" ]; then while read line; do fcnctionA "$line" done else while read line; do fcnctionA "$line" done < "$FileName" fi ------------------------------------------------ (1) if [ "\-" = "$1" ]; then 部分が理解できないのですが、教えて頂けますでしょうか。 (2)  if [ "" = "$FileName" ]; then while read line; do fcnctionA "$line" done 基本はファイル名を指定して実行する事を前提としていると思います。 ファイル名を指定しないでスクリプトの実行をする場合は、1行ずつ標準入力で 入力すると思うのですが、このような使い方をする場合はあるのでしょうか。 下記よりも便利な点があるようでしたら、教えて頂けますでしょうか。 または、shiftと関係があるのでしょうか? if [ ! "" = "$FileName" ]; then while read line; do fcnctionA "$line" done < "$FileName" fi

  • 簡単なシェルスクリプトを見てください。

    次のようなシェルスクリプトを作成しました。 #!/bin/sh echo [$1] awk '/"0312345678"/ {print}' /test > /test1 awk '/$1/ {print}' /test > /test2 のように簡単なスクリプトです。 $ sample \"0312345678\" で実行させたら、echo では"0312345678"に出力されます。 しかし、test1にはちゃんと結果が入っていますが、test2は空のファイルです。 なぜ、結果が違うのですか? 実行時、引数を渡す方法で、test1と同じ結果を得たければ、どうすればいいのですか?

  • awk の使い方

    sample.txt ファイルには   "中村" "08/01/80" "03.1234.5678"   "木村" "08/01/81" "06.1252.2536" のような情報があります。 そこの3番フィールドが電話番号ですので、awkで検索しようと思っています。 それで、 awk -v ARGU="$NUM" ' { VAR=substr($3,2,(length($3)-2)) if ( ARGU == VAR ) {print} }' /sample.txt のようにして、検索をかけようとしましたが、できません。 どこが間違っているのか教えてください。 awkの他の方法があるとか、違うもの(sed or grep)でできるのであれば、お願いします。

  • シェルでawkを使い行数を取り出すには?

    #!/bin/sh gyo=awk 'END{print NR}' sample.dat 変数gyoにsample.datの行数をいれたいのですが、 これではcommand not foundと出てしまいます。 次に awk 'END{'gyo'=NR}' sample.dat としてみたのですが今度はシンタックスエラーが出てしまいます。 どうすればsample.datの行数をシェルの変数に代入できるでしょうか?

  • awkについて

    UNIXのawkコマンドにて、レコードを抜き出したいのですが、その時抜き出した各レコード毎に改行 をいれたいのですが、下記のような定義で問題ないでしょうか? awk -f PGMファイル 元データファイル > 抜き出したデータファイル PGMファイル は下記です。 BEGIN{ORS=\"\\n\"}  ←改行でいいんでしょうか? { if(substr($0, 5, 1) == \"1\"){ if(substr($0, 6, 2) == \"2\"){ print substr($0, 1,138) } } }

  • シェルの変数の動作についての質問

    solaris8上で、シェルから別のシェルを子プロセスを動作させて その子プロセスが終了したかを判定するシェルを作成しました。 そのシェルの抜粋は下記のようになっています。 ---------------------------------------------------- "コマンド実行" & PID=$! i=0 ERR_FLG=1 echo " PID="$PID >> tmp.txt   ・・・・(1) while [ 1 ] do   if [ `ps -ef | grep $PID | grep -v grep | wc | awk '{print $1}'` -eq 0 ]; then     ERR_FLG=0     break   fi   "終了条件を満たしたかを確認するサブルーチン"   if [ $? -eq 1 ]; then     echo "Time out" >> tmp.txt     break   fi   i=`expr $i + 1 `   sleep 10 done echo `ps -ef | grep $PID | grep -v grep` >> tmp.txt ・・・・(2) ---------------------------------------------------- 殆どの場合問題なく動作しているのですが、 ごく稀に、(1)と(2)で取得した$PIDの値が異なるという現象が起きます。 当然サブルーチン上で、PIDを書換する処理もありません。 どのような状況の時に、現象が起きるかもはっきりしていません。 この現象の回避方法が判る方がおられましたら御教示の程、 宜しくお願いします。

  • zenityを使ったシェルスクリプトについて

    zenityを使ったシェルスクリプトを作りたいのですが、どう書けば良いのかわかりません。ちなみにbashです。 行いたいのはzenityを使って2回質問をし、2回ともOKだった場合に最終的に行いたいコマンドの実行をするというものです。 単純にif文を2回繰り返せば良いのでしょうが、書き方がわかりません。 以下のような具合になるのでしょうか? #!/bin/bash a=$(zenity --question --title "shred" --text "よろしいですか?"); if [ $? -eq 0] then a=$(zenity --question --title "shred" --text "本当によろしいですか?"); if [ $? -eq 0 ] then gedit $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS fi fi

  • awk の使い方

    sample.txt ファイルには   "中村" "08/01/80" "03.1234.5678"   "木村" "08/01/81" "06.1252.2536" のような情報があります。(フィールドの区別はTabです) そこの3番フィールドが電話番号ですので、awkで検索しようと思っています。 それで、 $ shell 06.1252.2536 #!/bin/sh NUM=$1                    #引数をNUMに代入 awk -v ARGU="$NUM" ' { VAR=substr($3,2,(length($3)-2))      #「"」を取り除いた if ( ARGU == VAR ) {print}         #電話番号と比較 }' /sample.txt のようにして、検索をかけようとしましたが、できません。 どこが間違っているのか教えてください。 awkの他の方法があるとか、違うもの(sed or grep)でできるのであれば、お願いします。