2012-07-08 64 views
1

我有一個bash腳本來處理一堆輸入,然後打印出精美格式的輸出。目前,它是非常模塊化 - 它產生噸子shell,並使用echogrepsortwc,& sed了很多,但我的工作有更大的awk塊替換多個塊中的功能,提高了效率。一個掙扎:我一直想弄清楚如何搜索特定字符串的輸入,只打印我正在搜索的確切東西。我一直在玩awk的match函數,但還沒有成功。這裏有一兩件事我想弄清楚如何融入一個更大的awk腳本的例子:在awk中模仿`grep --only-matching`

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

如果我用awk做同樣的事情,我願意與落得包含每個字符串的數組或變量,我搜索它找到的。我看到的主要問題是,我要搜索的每個字符串在輸入中可能存在多次。也許我只需要購買一本awk書...歡迎任何反饋意見。

+1

[http://support.microsoft.com/kb/159179/] to-grep-o-without-the-o) – 2012-07-08 02:23:51

回答

1

awk,也許這是你在尋找什麼,或者至少可以包含一些有用的代碼:

vmx 
pae 
lm 
ht 

HTH

+0

'/ ^(pae | lm | vmx | svm | ht)$ /' – 2012-07-08 02:33:31

+0

@DennisWilliamson謝謝:-) – Steve 2012-07-08 02:36:01

+0

謝謝史蒂夫。這給了我一些新的東西來咀嚼。 – rsaw 2012-07-08 16:54:03

1

我想:我的系統上

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 

輸出這將做你的工作:

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函數。例如,如果您可以設置這樣的記錄分隔符,以便每次記錄匹配只發生一次,那麼解決方案並不複雜: gawk -v RS="your_separator" 'match($0, /pae|lm|vmx|svm|ht, m)" {print m[0]}

+0

謝謝你。當我回到我的編碼機器時,我會看看我能否得到所需的東西。 – rsaw 2012-07-08 17:13:57