在一個文本文件計數獨特的行
我對這種事情的別名,因爲我碰到這個問題如此頻繁:
alias cnt='sort -if |uniq -ic |sort -ifn' # case insensitive
alias CNT='sort |uniq -c |sort -n' # strict, case sensitive
這個排序輸入(-i
忽略非打印字符,-f
忽略大小寫)然後使用uniq
(它只能處理預先排序的數據,-i
不區分大小寫,-c
對重複進行計數),然後對數字進行排序(數字爲-n
)。 (注:cnt
輸出的最後一種情況可能更大寫比預期由於命令如何糾正情況下的差別。)
調用此類似:
cat 20150229.log |cnt
參數給cnt
將被傳遞到最終sort
命令,因此您可以使用像-r
這樣的標誌來反轉排序。我建議通過tail
或類似awk '$1 > 5'
來運行它,以消除所有小條目。
解析XML
以上隨機文本文件日誌一樣的偉大工程。解析HTML或XML是一種Bad Idea™,除非您完全知道要解析的確切格式。
這就是說,你有一個grep
查詢與有缺陷的正則表達式匹配XML:
grep '<Account Id="*">'
這符合<Account Id="">
(以及<Account Id=">
和<Account Id=""">
,你可能不希望)但它不符合你的例子<Account Id="123456789012">
。該正則表達式中的*
會查找零個或多個前一個字符("
)。這裏是a more thorough explanation。
你需要一個.
在那裏表示任何字符(explanation here):
grep '<Account Id=".*">'
此外,除非你給它-x
標誌grep
不會匹配全行,我猜你不」不要這樣做,因爲如果有周圍的空白,它會失敗(參見上面的Bad Idea™鏈接!)。這是一個更便宜的grep版本,利用我的別名:
grep '<Account Id=' 20150229.log |cnt
編輯您的問題,包括一些簡潔的,可測試樣本輸入和期望的輸出,所以我們可以幫助你,但一目瞭然 - '*'意味着'前面的正則表達式段的零或更多的重複',你應該使用'[^「] *'而不是'*'。還有其他的 –
使用XML/HTML解析器(xmllint,xmlstarlet ...)。 – Cyrus
'sort'本身可以爲你生成唯一的行,嘗試'grep -E'
dawg