これは私のコマンドです:
cat httpd.conf | grep ^LogFormat | awk -F\" '{print $(NF)}'
出力:
commonsess
common
または、値の数に制限はなく、この値を配列に保存してインデックス番号を使用して1つずつ印刷する必要があります。
答え1
シェルで配列やループを使用することは、一般的にコーディング習慣が悪いという信号です。シェルは他のコマンドを実行するためのツールです。awk
テキストレコードのフィールドを使用して複雑な操作を実行するための一般的なコマンド。awk
何百ものコマンドループを実行するのではなく、ジョブに対して一度呼び出したいと思います。
次から始まる行のインデックスと最後のフィールド名を印刷する場合^LogFormat
:
awk '/^LogFormat/{print n++, $NF}' httpd.conf
cat
(接続のため)、grep
(awk
yesの親セット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"