如何打印两场比赛之间的所有数据,从第一场比赛后的特定行开始。例如,假设我有两个模式Linux
,Unix
并且这两个单词之间有条目,我想打印单词之后特定行的数据Linux
,在下面的示例中,Linux 之后的第 6 行,直到单词Unix
:
Linux
12
32
34
556
676
77
85434
rdb
232323
232435656
Unix
98736
4345
4546456
456
预期输出:
85434
rdb
232323
232435656
我怎样才能使用 awk、sed 和 grep 来做到这一点?
答案1
每当你看到相对寻址时,你应该伸手去寻找ed
。
echo '/Linux/+7,/Unix/-1p' | ed -s input_file.txt -
或者,作为定理:
ed -s input_file.txt - <<\EOF
/Linux/+7,/Unix/-1p
EOF
答案2
尝试这个,
awk '/^Linux$/{flag=1;next}/^Unix$/{flag=0}flag' file | tail -n +7
或者没有tail
:
awk '/^Linux$/{flag=1;n=NR;next}/^Unix$/{flag=0};flag&&NR>(n+6);' file
解释:
- 搜索pattern
^Linux$
,如果找到,则设置flag
为1(true)并直接移动到next
行。 - 继续下去,直到
^Unix$
找到模式并将其设置flag
为 0(假) - 最后
flag
的 是 awk 特定符号。如果flag
为 true,则打印该行,否则不执行任何操作。 flag
只是一个变量名,可以是任何内容,例如f
或printthisline
。
使用 Gnu sed
:
sed '/^Linux$/,/^Unix$/{//!b};d' file | tail -n +7
答案3
我会写其中之一
sed -n '/Linux/,/Unix/p' file | sed '1,7d;$d'
# or
awk '/Linux/ {nr = NR} /Unix/ {exit} nr && NR > nr+6' file
答案4
如果您搜索,grep
您可以这样做:
grep -A 5 "string used to search" <path-to-file(s)>
将显示匹配字符串后的 5 行grep -B 5 "string used to search" <path-to-file(s)>
将显示匹配字符串之前的 5 行grep -C 5 "string used to search" <path-to-file(s)>
将显示匹配字符串前后的 5 行(C 代表上下文)
对于你的例子,它将是:
grep -A 2 -B 1 "rdb" <path-to-file(s)>