我经常会grep -n whatev文件找到我正在寻找的东西。说输出是
1234: whatev 1
5555: whatev 2
6643: whatev 3
如果我想在1234和5555之间提取线条,是否有工具可以做到这一点?对于静态文件,我有一个脚本,它执行文件的wc -l,然后进行数学计算,将其与tail&但是对于不断写入的日志文件来说,这并不能很好地解决这个问题。
答案 0 :(得分:71)
尝试使用上面提到的sed http://linuxcommando.blogspot.com/2008/03/using-sed-to-extract-lines-in-text-file.html。例如,使用
sed '2,4!d' somefile.txt
从somefile.txt的第二行打印到第四行。 (不要忘记检查http://www.grymoire.com/Unix/Sed.html,sed是一个很棒的工具。)
答案 1 :(得分:23)
以下命令将执行您要求的操作"提取1234和5555之间的行"在 someFile 。
sed -n '1234,5555p' someFile
答案 2 :(得分:5)
如果我理解正确,您希望在两个行号之间找到一个模式。 awk单行可能是
awk '/whatev/ && NR >= 1234 && NR <= 5555' file
您无需运行grep
,然后sed
。
Perl one-liner:
perl -ne 'if (/whatev/ && $. >= 1234 && $. <= 5555') {print}' file
答案 3 :(得分:2)
如果您可以保证所需的位置,则行号可以。多年来,我最喜欢的一个是这样的:
sed "/First Line of Text/,/Last Line of Text/d" filename
删除从第一个匹配行到最后一个匹配的所有行,包括那些行。
使用sed -n 与“ p ”代替“ d ”来代替打印这些行。对我来说更有用,因为我通常不知道那些线在哪里。
答案 4 :(得分:0)
将其放入文件并使其可执行:
#!/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
使用参数执行文件(注意脚本不处理参数中的空格!):
要与您的示例一起使用,请使用参数:1234 5555 myfile.txt
包含具有开始和停止模式的行。
答案 5 :(得分:0)
如果你想要行而不是行范围,你可以用perl来做:例如。如果你想从文件中获取第1,3和5行,请说/ etc / passwd:
perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd