我正在尝试使用该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
匹配较长数字中的子字符串。
匹配\|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