3

catこのスクリプトをファイルに取得しようとしており、見つかった各行のgrep各行877について、IP である最初の列を出力し、ホストに保存します。awk毎回引っかかる。sh -x some.shどこにぶら下がっているのか、走って見に行きます。リストではなくファイルに出力する必要がありますか? なぜ引っかかるのawkですか?

hosts=()

FILENAME=/home/somethin/.hosts.conf

ips=`cat $FILENAME | grep -v '877'`

for line in $ips; do
     hosts=$(`awk '{print $1}'`)
done

echo $hosts
4

3 に答える 3

9

すべて awk を使用して実行できます。

hosts=( $(awk '/877/{print $1}' $FILENAME) )

echo "${hosts[@]}"
于 2013-06-24T14:02:31.947 に答える
1

元のコードと修正されたバージョン/コードレビューに基づいてこのスレッドに回答するには:

#ideally use variable names that do not exist as a command
hosts=()

FILENAME="/home/somethin/.hosts.conf"

ips=`cat $FILENAME | grep '322'`

for line in $ips; do
     hosts+=("`echo $line | awk '{print $1}'`")
     #alternative for shells not supporting the += operator:
     #hosts=("${hosts[@]}" "`echo $line | awk '{print $1}'`")
done

echo ${hosts[@]}

指摘すべき問題がいくつかあります。スクリプトが「スタックしている」という印象を与えます。

  • 毎回ホストを新たに割り当てていますhosts=$(`awk '{print $1}'`)
  • 意図的であろうとなかろうと、逆を選択しています。つまり、 grep フラグと一致-vしません。
  • コマンドを含まない入力で、ドルとバッククォート表記でネストされたコマンド置換を実行しています: $(awk '{print $1}' )
  • awk には入力がありません
  • echo variablenamebash配列の最初の要素のみを出力します

注: と を使用して多くのことを実行できますawksed、どちらもより詳細な内容へのショートカットとして意図されていますが、後で拡張しやすい、より構造化された bash/shell スクリプトも意図されています。したがって、トレードオフがあり、最初の方法に問題はありません....

于 2013-09-30T19:33:50.463 に答える