如何显示文件指定模式前的内容?sed命令反向输出问题求助
解决思路:提取文件开头至指定模式行的内容
我来帮你分析下问题,顺便给出可行的解决办法~
首先得说清楚你原来的命令为什么会得到相反结果:你用的 sed -n '/2019-10-29-12-00/,/endif/p' file.txt,逻辑是从匹配到2019-10-29-12-00的行开始,一直打印到匹配endif的行结束。但你的文件里根本没有endif这个模式,sed就会默认打印到文件末尾,自然和你想要的“到该行为止”完全相反了。
想要实现“提取从文件开头,直到包含2019-10-29-12-00的行(包含该行)”的需求,有几种简单的方法:
方法1:用sed指定正确的范围
直接把范围的起始点设为文件第一行,结束点设为目标模式:
sed -n '1,/2019-10-29-12-00/p' file.txt
-n参数让sed只打印我们指定的内容1,/模式/表示从第1行开始,到第一个匹配该模式的行结束,包含这两行
方法2:用grep+head组合(适合直观理解)
先找到目标行的行号,再用head提取前N行:
# 先获取目标行的行号 line_num=$(grep -n "2019-10-29-12-00" file.txt | cut -d: -f1) # 提取前line_num行 head -n "$line_num" file.txt
或者写成一行简化版:
grep -n "2019-10-29-12-00" file.txt | cut -d: -f1 | xargs -I {} head -n {} file.txt
补充说明
如果你的文件里有多个匹配2019-10-29-12-00的行,上述两种方法都会提取到第一个匹配行为止的内容。如果需要提取到最后一个匹配行,sed的写法可以调整为:
sed -n '/2019-10-29-12-00/!{p;b};p;:a;n;ba' file.txt
不过看你的示例文件只有一个目标行,第一种方法就完全够用啦。
内容的提问来源于stack exchange,提问作者Ezzmazz
相关产品推荐
相关产品推荐

