
我正在嘗試使用該sed
命令在文件中搜尋 10000 及以下的所有條目,但我認為這個不完整的sed
搜尋字串可能適用於 10000 及以上的條目:
sed -n "/[0-9][0-9][0-9][0-9][0-9]/ q" logfile
答案1
您也可以使用以下方法來完成此操作:
$ sed -n "/^[0-9]\{0,4\}$\|10000/p" logfile
例子
假設我有一個範例文件,logfile
如下所示:
$ seq 9900 10050 | sed 's/$/ /' > logfile
這導致文件logfile
看起來像這樣:
$ head -5 logfile
9900
9901
9902
9903
9904
$ tail -5 logfile
10046
10047
10048
10049
10050
sed 's/$/ /'
由於我們在建立範例文件時上面的行,每一行後面都有一個尾隨空格。
現在當我們運行上面的sed
命令時:
$ sed -n "/^[0-9]\{1,4\}[^0-9]\|10000/p" logfile | tail -5
9996
9997
9998
9999
10000
我們將所有內容都設為 10000,僅此而已。
怎麼運作的
上面的工作原理是尋找以數字範圍 0-9 開頭、長度範圍sed
在 1 到 4 之間的行。最後的符號表示非 0-9 的字元。這會阻止匹配較長數字中的子字串。sed
"/^[0-9]\{1,4\}[^0-9]
[^0-9]
sed
匹配\|10000
10000,因為與之前的其餘字串相比,它有點獨特。尾部p
告訴sed
列印結果。
使用 grep 作為替代方案
使用sed
並不是真正正確的搜尋工具。你可能最好用grep
它來代替。
$ grep "\b\([0-9]\{1,4\}\|10000\)\b" logfile | head -5
9900
9901
9902
9903
9904
$ grep "\b\([0-9]\{1,4\}\|10000\)\b" logfile | tail -5
9996
9997
9998
9999
10000
上面的程式碼將找到包含 10000 或以下數字字串的所有行。表示\b
字串之前或之後的邊框。
答案2
Perl 可以讓這件事變得更容易、更易讀:
perl -nE 'say for grep { $_ <= 10_000 } /([0-9]+)/g' your_file
答案3
sed '/[0-9]/!d;/10000/q' <log.file
只要條目按順序排列,您只需指定該行包含一個數字!
,否則d
將其刪除。當你排隊的時候你就可以10000
了q
。但 10000 仍然被列印 - 這將是列印的最後一行。
如果您可以將其錨定到行首,例如:
sed '/^[0-9]/!d;/^10000/q' <log.file
這將是一件更確定、更快的事情。
但是,正如 slm 指出的那樣,grep
速度會更快。
答案4
sed -nr "/0|[1-9][0-9]?[0-9]?[0-9]?[0-9]?/p" logfile