Linux 如果在AWK中满足条件,则打印行范围

Linux 如果在AWK中满足条件,则打印行范围,linux,awk,Linux,Awk,我想做的是使用awk显示一条线上面的两行和下面的两行,该线在没有管道的情况下满足特定条件。例如,我正在搜索字符串“s62234”,找到后,我想打印蓝色矩形中的所有行,如所附屏幕截图所示 这是我正在使用的文件(thefmifile.txt) 我尝试的是使用awk查找符合条件的行,并使用NR获取所需的其他行的编号,但似乎我遗漏了一些内容 以下是我使用的命令: cat thefmifile.txt | awk -F ':' '$1==s62234 {for (x = NR -2; x <= N

我想做的是使用awk显示一条线上面的两行和下面的两行,该线在没有管道的情况下满足特定条件。例如,我正在搜索字符串“s62234”,找到后,我想打印蓝色矩形中的所有行,如所附屏幕截图所示

这是我正在使用的文件(thefmifile.txt)

我尝试的是使用awk查找符合条件的行,并使用NR获取所需的其他行的编号,但似乎我遗漏了一些内容

以下是我使用的命令:

cat thefmifile.txt | awk -F ':' '$1==s62234 {for (x = NR -2; x <= NR + 2; x++){print}}'
当它是{print x}时,它会显示我需要的行数,但是是否有某种方法可以将文件的行作为数组中的元素访问,并且只使用这个“x”作为索引(例如,类似NR[x])

或者是否有其他方法检索这些行?
谢谢大家!

使用grep很容易做到这一点:

-B, --before-context=NUM  print NUM lines of leading context
-A, --after-context=NUM   print NUM lines of trailing context
-C, --context=NUM         print NUM lines of output context
-NUM                      same as --context=NUM
使用awk,您可以执行以下操作:

awk -F ':' '$1==s62234{print l2;print l1;a=3}a&&a-->0{print}{l2=l1;l1=$0}' thefmifile.txt

您可以通过将before行存储在一个数组中并使用循环来动态处理before行的数量。

$awk-vn=2-F':''$1==“s62234”{for(i=0;i您可以尝试以下操作吗,simple
grep
可以处理此任务

$ awk -v n=2 -F':' '$1=="s62234"{for (i=0;i<n;i++) print buf[(NR+i)%n]; c=n+1} c&&c--; {buf[NR%n]=$0}' file
s62199:x:1278:504:Nikola Petrov,SI,2,5:/home/SI/s62199:/bin/bash
s62219:x:1279:504:Viliyan Ivanov,SI,2,6:/home/SI/s62219:/bin/bash
s62234:x:1280:504:Viktoriya Dobreva,SI,2,3:/home/SI/s62234:/bin/bash
s855264:x:1281:504:Toni Dupkarski,SI,4,2:/home/SI/s855264:/bin/bash
s81555:x:1282:503:Elena Georgieva,KN,2,0:/home/KN/s81555:/bin/bash
grep -A2 -B2 '^s62234:' Input_file
更准确地说,您可以尝试以下操作,以将精确字符串与
grep
匹配:

grep -C2  '^s62234:' Input_file

@RavinderSingh13工作完美且非常简单,非常感谢!@Victoria,您的欢迎,很高兴它帮助了您。您也可以看到此链接一次@steffen the awk不起作用,但grep是个好主意,谢谢!@EdMorton the op想要awk,所以它可能不值得使用谢谢,它起作用了!您能提供一些解释吗是给初学者的吗?@Victoria是的,我现在只带着手机,所以我稍后再写..a--但是每行递减,如果为正(>0),则为真.FWIW我之所以使用
a&&a--
而不是
a-->0
是因为对于一个巨大的文件
a--
可以卷起并再次变得积极。只是尝试了一下,效果也很好,非常感谢!你能给我解释一下“buf”和“c&&c--”这两个词吗?因为我是一个初学者,实际上到目前为止还没有遇到过这两个词?不客气。我在回答中添加了一个解释。
grep -A2 -B2 '^s62234:' Input_file
grep -C2  '^s62234:' Input_file