1

bash大量の入力を処理し、きれいにフォーマットされた出力を出力するスクリプトがあります。現時点では非常にモジュール化されており、大量のサブシェルを生成し、、、、、などを使用しますがecho、効率grepを高めるために、複数のチャンクの機能をより大きなチャンクに置き換える作業を行っています。sortwcsedawk

1つの苦労:私は特定の文字列の入力を検索する方法を理解しようとしていて、検索しているものを正確に印刷するだけです。私はawkのmatch機能で遊んでいますが、まだ成功していません。これは、より大きなawkスクリプトに統合する方法を理解しようとしている1つの例です。

$ egrep -o "pae|lm|vmx|svm|ht" /proc/cpuinfo | sort -u
ht
lm
pae
vmx

同じことをするためにawkを使用する場合、検索した各文字列を含む配列または変数になりたいと思います。私が見ている主な問題は、検索している各文字列が入力に複数回存在する可能性があることです。たぶん私はawkの本を買う必要があるだけです...どんなフィードバックも歓迎します。

4

2 に答える 2

1

ではawk、おそらくこれが探しているものであるか、少なくともいくつかの役立つコードが含まれている可能性があります。

awk '{ for (i = 1; i <= NR; i++) if ($i ~ /^(pae|lm|vmx|svm|ht)$/) array[$i]++ } END { for (j in array) print j }' /proc/cpuinfo

私のシステムでの出力:

vmx
pae
lm
ht

HTH

于 2012-07-08T02:32:16.897 に答える
1

私はこれがあなたの仕事をすると思います:

awk -v RS="pae|lm|vmx|svm|ht" 'RT != "" {print RT}' /proc/cpuinfo

または、awk でソートも行う必要がある場合:

gawk -v RS="pae|lm|vmx|svm|ht" 'RT != "" {m[RT]} END{n=asorti(m, m_sorted); for(i=1;i<=n;++i){print m_sorted[i]}}' /proc/cpuinfo

説明: レコード セパレータRSを必要な正規表現に設定し、awk はRS正規表現の正確な一致をRT変数に格納します。RT最後のレコードは空であるため、空でないことを確認する必要があります。

ソート版は拡張機能asortiを使用しています。gawk

より一般的なアプローチについては、match機能を調べてください。たとえば、このようなレコード セパレータを設定して、一致がレコードごとに 1 回だけ発生するように設定できる場合、ソリューションは複雑ではありません。 gawk -v RS="your_separator" 'match($0, /pae|lm|vmx|svm|ht, m)" {print m[0]}

于 2012-07-08T02:36:40.653 に答える