我想: 1)从支持特定关键短语的文件中提取整数N,例如, '没有线' 2)grep N行在另一个特定短语之后,说'从这里开始',即:
输入文件
no of lines 8
.....
start from here
0.6250000000 1 O 1
0.8750000000 1 O 2
0.1250000000 1 O 3
0.3750000000 1 O 4
0.6250000000 1 O 5
0.8750000000 1 O 6
0.1250000000 1 O 7
0.3750000000 1 O 8
.....
输出:
start from here
0.6250000000 1 O 1
0.8750000000 1 O 2
0.1250000000 1 O 3
0.3750000000 1 O 4
0.6250000000 1 O 5
0.8750000000 1 O 6
0.1250000000 1 O 7
0.3750000000 1 O 8
想到这样的事情会:
N=`grep 'no of lines' file| tr -d A-Za-z' '`
grep -A $N 'start from here'
但显然grep不允许以这种方式传递参数。
感谢您的帮助。
PS。不需要坚持grep。
更新: 我正在处理的文件实际上是一个DOS文件,我不知道。这引起了一切麻烦。所以事实上,所有提出的解决方案,包括我的(纠正的):
tr -d '\r' < file > file_n
N=`grep 'no of lines' file_n| tr -d A-Za-z' '`
grep -A $N 'start from here' file_n
工作得很好。
答案 0 :(得分:1)
使用awk会更容易:
awk '/^no of lines/{N=$NF; next} /^start from here/{s=1; i=0}
s && i<=N{print; i++; next} {s=0}' file
start from here
0.6250000000 1 O 1
0.8750000000 1 O 2
0.1250000000 1 O 3
0.3750000000 1 O 4
0.6250000000 1 O 5
0.8750000000 1 O 6
0.1250000000 1 O 7
0.3750000000 1 O 8
答案 1 :(得分:1)
当然grep
允许以这种方式传递参数(因为它甚至不知道变量是传递还是纯文本)。
您的脚本存在的问题是您没有为第二个grep
命令指定文件名。这是一个更好的脚本版本,可以正常工作:
n=$(grep -Pom 1 'no of lines \K[0-9]+' yourfile)
grep -A "$n" 'start from here' yourfile
答案 2 :(得分:0)
您可以使用xargs
将结果从第一次调用grep
重定向到第二次调用:
grep 'no of lines' file|tr -d A-Za-z' '|xargs grep 'start from here' file -A
答案 3 :(得分:0)
使用awk
awk '/^no of lines/{N=$NF}
/^start from here/{for(i=1;i<=N+1;i++) {print;getline}}' file