![显示文件中的特定数据](https://linux22.com/image/1282144/%E6%98%BE%E7%A4%BA%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E7%89%B9%E5%AE%9A%E6%95%B0%E6%8D%AE.png)
我希望能够从命令行搜索名称,它会显示出现在其下的字母 A、B、C、D、E、F 和名称,而不是中间的内容。因此,如果我搜索 tim,它应该显示:
B
tim
文件如下:
A
bob
john
B
tom
tim
C
phil
bob
D
gary
tony
E
anne
rachel
F
gareth
答案1
好吧,那再像这样:
awk "/^[A-Z]\$/{ l=\$1 ; } ; /^${NAME}\$/ { print l ; exit ; };"
缺点:涉及引用(我个人尽量避免)、正则表达式(难以理解)和 awk(难以理解)
优点:我思考这确实有效,至少就我所理解的而言是如此。
(不用说,您应该将 ${NAME} 替换为您要搜索的条目,例如 tim)
评论部分要求的解释:
/^[A-Z]\$/{ l=\$1 ; }
对于每行单个大写字母,将该行上的第一个(唯一)项目分配给变量 l(字母 ell)。
/^${NAME}\$/ { print l ; exit ; }
对于与 ${NAME} 匹配的每一行(您应该用您要查找的内容替换 ${NAME},如我上面所述,或者在运行命令之前设置并导出 NAME 环境变量),打印变量 l 的最新值,然后退出。实际上,程序在遇到与指定值完全匹配的行后立即退出,紧接着打印最近遇到的与第一个正则表达式匹配的行。
我引用了除用于 ${NAME} 的 $ 之外的所有 $,因为我使用了双引号而不是单引号(以允许 ${NAME} 扩展,但避免与其他 $ 混淆。
答案2
grep -B1 <searchstring> <filename>
例如
grep -B1 tim file