1

次のコードを取得して、ユーザーから変数を読み取ろうとしています。検索するファイル、検索文字列、出力用の空白と出力するフィールドの量が必要でした。

最初の問題はAWKコマンドにあります。「」(単一のスペース」や「\ t」などの有効な空白を入力すると、未終了の文字列と構文エラーが発生します。これは、複数のフィールドの出力を要求した場合にのみ発生します(それ以外の場合、空白は追加されません)の上)。

次に、検索文字列を使用する場合、GREPは少し扱いに​​くいようです。文字列全体を使用するには、変数の開始と終了に二重引用符を追加する必要がありました。

#!/bin/bash
#****************************************************
#Name:          reportCreator.sh
#Purpose:       Create reports from log files
#Author:        
#Date Written:      11/01/2013
#Last Updated:      11/01/2013
#****************************************************

clear

#Determine what to search for
printf "Please enter input file name(s): "
read inputFile
printf "Please enter your search query: "
read searchQuery
printf "Please enter the whitespace character: "
IFS= read whitespace
printf "Please enter the amount of fields to be displayed: "
read fieldAmount

#Add quotation marks to whitespace and searchQuery
whitespace=\""$whitespace"\"
searchQuery=\""$searchQuery"\"

#Declare variables
declare -i counter=0
declare -a fields[$fieldAmount]
declare -a fieldInsert[$fieldAmount]

#While loop for entering fields
while [[ "$counter" -ne "$fieldAmount" ]]
do
        #Ask for field numbers
        printf "Please enter number for required field $((counter+1)): "
        read fields[$counter]
        ((counter++))
done

#Create function to add '$' before every field and the whitespace characters
function fieldFunction 
{
    for (( counter=0; counter <= ($fieldAmount-1); counter++ ))
    do
        fieldInsert[$fieldAmount]="$""${fields[$counter]}"
        if (( counter!=($fieldAmount-1) ))
        then
            printf "${fieldInsert[*]}$whitespace"
        else
            printf "${fieldInsert[*]}"
        fi  
    done
}
printf "%b\n"

tac $inputFile | grep "$searchQuery" | less #| awk '{print $(fieldFunction)}'

exit 0

どんな助けでもいただければ幸いです。

4

2 に答える 2

1
  1. Grepは引用符を理解しないため、引用符を$searchQueryに追加する行を削除します。
  2. awkには一重引用符ではなく二重引用符を使用して、$(fieldFunction)が展開されるようにします。

これを修正すると(もちろん、awkのコメントを外すだけでなく)、次のように機能します。

user@host 15:00 ~ $ cat script
#!/bin/bash
#****************************************************
#Name:          reportCreator.sh
#Purpose:       Create reports from log files
#Author:        
#Date Written:      11/01/2013
#Last Updated:      11/01/2013
#****************************************************

clear

#Determine what to search for
printf "Please enter input file name(s): "
read inputFile
printf "Please enter your search query: "
read searchQuery
printf "Please enter the whitespace character: "
IFS= read whitespace
printf "Please enter the amount of fields to be displayed: "
read fieldAmount

#Add quotation marks to whitespace and searchQuery
whitespace=\""$whitespace"\"

#Declare variables
declare -i counter=0
declare -a fields[$fieldAmount]
declare -a fieldInsert[$fieldAmount]

#While loop for entering fields
while [[ "$counter" -ne "$fieldAmount" ]]
do
        #Ask for field numbers
        printf "Please enter number for required field $((counter+1)): "
        read fields[$counter]
        ((counter++))
done

#Create function to add '$' before every field and the whitespace characters
function fieldFunction
{
    for (( counter=0; counter <= ($fieldAmount-1); counter++ ))
    do
        fieldInsert[$fieldAmount]="$""${fields[$counter]}"
        if (( counter!=($fieldAmount-1) ))
        then
            printf "${fieldInsert[*]}$whitespace"
        else
            printf "${fieldInsert[*]}"
        fi
    done
}
printf "%b\n"

tac $inputFile | grep "$searchQuery" | awk "{print $(fieldFunction)}"

exit 0
user@host 15:01 ~ $ cat file
foo two three four
foo two2 three2 four2
bar two three four
user@host 15:01 ~ $ bash script
Please enter input file name(s): file
Please enter your search query: foo
Please enter the whitespace character:
Please enter the amount of fields to be displayed: 2
Please enter number for required field 1: 4
Please enter number for required field 2: 2

four2   two2
four    two
user@host 15:01 ~ $
于 2013-01-11T23:03:28.733 に答える
0

コードのこのセクションを見てみましょう。

#Create function to add '$' before every field and the whitespace characters
function fieldFunction
{
    for (( counter=0; counter <= ($fieldAmount-1); counter++ ))
    do
        fieldInsert[$fieldAmount]="$""${fields[$counter]}"
        if (( counter!=($fieldAmount-1) ))
        then
            printf "${fieldInsert[*]}$whitespace"
        else
            printf "${fieldInsert[*]}"
        fi
    done
}
printf "%b\n"

tac $inputFile | grep "$searchQuery" | awk "{print $(fieldFunction)}"

次のように、より簡単かつ堅牢に書き直すことができます。

tac "$inputFile" |
awk -v fieldsStr="${fields[*]}" -v searchQuery="$searchQuery" -v OFS="$whitespace" '
   BEGIN{ numFields = split(fieldsStr,fieldsArr) }
   $0 ~ searchQuery {
      for ( i=1; i <= numFields; i++ )
         printf "%s%s", (i==1?"":OFS), $(fieldsArr[i])
      print "\b"
   }
'

ファイルを開くために「tac」が必要な理由はわかりませんが、理由があると思いますので、そのままにしておきます。

于 2013-01-12T15:27:28.243 に答える