使用 sed 指令搜尋文字檔中 10000 及以下的條目

使用 sed 指令搜尋文字檔中 10000 及以下的條目

我正在嘗試使用該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

匹配\|1000010000,因為與之前的其餘字串相比,它有點獨特。尾部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將其刪除。當你排隊的時候你就可以10000q。但 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

相關內容