コマンド出力を配列に保存し、1つずつ印刷します。

コマンド出力を配列に保存し、1つずつ印刷します。

これは私のコマンドです:

cat httpd.conf | grep ^LogFormat | awk -F\" '{print $(NF)}'

出力:

commonsess
common

または、値の数に制限はなく、この値を配列に保存してインデックス番号を使用して1つずつ印刷する必要があります。

答え1

シェルで配列やループを使用することは、一般的にコーディング習慣が悪いという信号です。シェルは他のコマンドを実行するためのツールです。awkテキストレコードのフィールドを使用して複雑な操作を実行するための一般的なコマンド。awk何百ものコマンドループを実行するのではなく、ジョブに対して一度呼び出したいと思います。

次から始まる行のインデックスと最後のフィールド名を印刷する場合^LogFormat:

awk '/^LogFormat/{print n++, $NF}' httpd.conf

cat(接続のため)、grepawkyesの親セットgrep)、シェル配列やシェルループは必要ありません。

答え2

戦略的に言えば、cat, grep and awk一般的に使用するのは間違っています。あなたは今

cat /etc/httpd/conf/httpd.conf | grep ^LogLevel | awk -F\" '{print $(NF)}'

配列の行を読み取るには、次のものを使用できます。read

while read -rd '' -a array
 do array+=("$REPLY")
 done < <(awk -F\" '/^LogFormat/{ print $(NF)}' httpd.conf)
printf '%s\n' "${array[0]}"

答え3

要するに
次のように使用できます。

a=( $(awk '/^LogFormat/{print $(NF)}' httpd.conf) )

httpd.confの単語を配列変数に入れますa

これでインデックスで要素にアクセスできるようになりました。

$ echo ${a[2]}
common

説明とイラスト

アシニンソート:

$ a=( e1 e2 e3 )
$ echo "count: ${#a}, a[2]: \"${a[2]}\""  
count: 3, a[2]: "e2"

一部の殻設定:

この例では、値として単語しかないことがわかっているので、これは必要ではありませんが、一般的に非常に重要です。値にまたはが含まれている場合は、
ワイルドカードを防ぐオプションが必要です。さらに、マイナーでない場合は、データに基づいて内部フィールド区切り文字IFSを設定、保存、および復元する必要があります。-f*?

$ # set -f
$ # IFS=$'\n'

私たちのテスト入力する:

$ in=httpd.conf
$ grep '^LogFormat' "$in"  | awk -F\" '{print $(NF)}'
 combined
 common
 referer
 agent

そしてあなたのものオリジナル注文する:

$ a=( $(cat "$in" | grep '^LogFormat' | awk -F\" '{print $(NF)}') )
$ echo "count: ${#a}, a[2]: \"${a[2]}\""
count: 4, a[2]: " common"

とともに短く@StéphaneChazelasのバージョン:

$ a=( $(awk '/^LogFormat/{print $(NF)}' $in) )
$ echo "count: ${#a}, a[2]: \"${a[2]}\""  
count: 4, a[2]: "common"

関連情報