Command line 如何";grep“;输出文件的特定行范围
有很多次我会grep-n whatev文件来找到我要找的东西。假设输出是Command line 如何";grep“;输出文件的特定行范围,command-line,grep,Command Line,Grep,有很多次我会grep-n whatev文件来找到我要找的东西。假设输出是 1234: whatev 1 5555: whatev 2 6643: whatev 3 如果我想只提取1234和5555之间的线,有没有工具可以这样做?对于静态文件,我有一个脚本,它对文件进行wc-l处理,然后用tail和head对其进行数学分割,但对于不断写入的日志文件来说效果不太好。尝试使用上提到的sed . 例如使用 sed '2,4!d' somefile.txt 从somefile.txt的第二行打印到第四
1234: whatev 1
5555: whatev 2
6643: whatev 3
如果我想只提取1234和5555之间的线,有没有工具可以这样做?对于静态文件,我有一个脚本,它对文件进行wc-l处理,然后用tail和head对其进行数学分割,但对于不断写入的日志文件来说效果不太好。尝试使用上提到的sed . 例如使用
sed '2,4!d' somefile.txt
从somefile.txt的第二行打印到第四行。(别忘了检查,sed是一个很棒的工具。)将其放入文件并使其可执行:
#!/bin/bash
start=`grep -n $1 < $3 | head -n1 | cut -d: -f1; exit ${PIPESTATUS[0]}`
if [ ${PIPESTATUS[0]} -ne 0 ]; then
echo "couldn't find start pattern!" 1>&2
exit 1
fi
stop=`tail -n +$start < $3 | grep -n $2 | head -n1 | cut -d: -f1; exit ${PIPESTATUS[1]}`
if [ ${PIPESTATUS[0]} -ne 0 ]; then
echo "couldn't find end pattern!" 1>&2
exit 1
fi
stop=$(( $stop + $start - 1))
sed "$start,$stop!d" < $3
#/bin/bash
开始=`grep-n$1<$3 | head-n1 | cut-d:-f1;退出${PIPESTATUS[0]}`
如果[${PIPESTATUS[0]}-ne 0];然后
echo“找不到开始模式!”1>&2
出口1
fi
stop=`tail-n+$start<$3 | grep-n$2 | head-n1 | cut-d:-f1;退出${PIPESTATUS[1]}`
如果[${PIPESTATUS[0]}-ne 0];然后
echo“找不到结束模式!”1>&2
出口1
fi
停止=$($stop+$start-1))
sed“$start,$stop!d”<$3
使用参数执行文件(请注意,脚本不处理参数中的空格!):
1234 5555 myfile.txt
包括具有开始和停止模式的行。以下命令将执行您在someFile中要求的“提取1234和5555之间的行”
sed-n'12345555p'someFile
如果需要行而不是行范围,可以使用perl:例如,如果要从文件中获取行1、3和5,请说/etc/passwd:
perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd
perl-e'while(){if(+$l~[1,3,5]){print}'
如果我理解正确,您希望在两个行号之间找到一个模式。awk一号班轮可能是
awk '/whatev/ && NR >= 1234 && NR <= 5555' file
如果你能保证你想要的东西的位置,行号是可以的。多年来,我最喜欢的口味是:
sed "/First Line of Text/,/Last Line of Text/d" filename
它删除从第一个匹配行到最后一个匹配行的所有行,包括这些行
使用sed-n和“p”代替“d”来打印这些行。这对我来说更有用,因为我通常不知道这些行在哪里。请参阅参考资料,
$l
是“一美元”而不是“一美元”。一个更高级(即更短)的命令是perl-ne'if($.~[1,3,5]){print}/etc/passwd
。我必须添加/
分隔符才能工作:sed-n'/1234/,/5555/p'一些文件
非常方便:)+1小东西,但是你不需要我一直在寻找的最佳和完美的报价。一个有用的后续信息是如何在sed结果中预先添加行号。。。将其导入nl,如下所示:sed“$start”、“$end”!d'somefile.txt | nl-ba-v$start
sed "/First Line of Text/,/Last Line of Text/d" filename