使用 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,仅此而已。

怎么运行的

上面的sed工作原理是查找以数字范围 0-9 开头、长度范围在 1 到 4 之间的行。 符号sed,"/^[0-9]\{1,4\}[^0-9]执行此部分。[^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

相关内容