如何使用 AWK 在特定行上打印内容

如何使用 AWK 在特定行上打印内容

如果在第“n”行找到字符串“clientside”,则应打印第“n-1”行的内容。

例如,我想打印第 12 行的内容,即当我在第 13 行/Partition/SSL_profile找到该字符串时。clientside

12: /Partition/SSL_profile
13:       context clientside

答案1

使用awk

clientside这将打印匹配的先前记录。第二个命令打印记录号和上一条记录。

awk '/clientside/{ print prev;};{prev=$0}' file
awk '/clientside/{ printf "%s: %s\n", (NR-1), prev};{prev=$0}' file

这些将打印先前的记录以及当前的输入记录($0)。

awk '/clientside/{ print prev; print $0};{prev=$0}' file
awk '/clientside/{ printf "%s: %s\n%s: %s\n", (NR-1), prev,NR,$0};{prev=$0}' file

clientside匹配时,打印变量中保存的前一条记录prev,然后打印当前输入记录($0)。

但这个命令会打印重复的行。

$ cat file
/Partition/SSL_profile
context1 clientside 
context2 clientside
context3 clientside

上面的命令给出以下输出:

awk '/clientside/{ print prev; print $0};{prev=$0}' file
/Partition/SSL_profile
context1 clientside 
context1 clientside 
context2 clientside
context2 clientside
context3 clientside

因此,应将命令更改为此以避免重复行。

 awk '/clientside/{ if(line!=prev_lineno) print prev; print $0; line=NR};
{prev=$0;prev_lineno=NR}' file

答案2

打印两个都行(上面的行和找到的 srting)

grep -B1 clientside file

在哪里

  • -B1代表前1行,使用-B5则打印前5行

仅打印之前的一行(并不是说您只有一个字符串,即使clientside出现两次)

grep -B1 clientside file | head -1

对于所有外观,使用反向 grep 删除匹配行和grep的组分隔符:

grep -B1 'clientside' file | grep -v '^--$\|clientside'

答案3

使用awk

$ awk '/clientside/ {if (a && a !~ /clientside/) print a} {a=$0}' file
/Partition/SSL_profile

使用sed

$ sed -n -e '/clientside/ {x;p;d;}' -e x file 
/Partition/SSL_profile

或 POSIXly:

$ sed -n '/clientside/{g
1!p
}
h
' file
/Partition/SSL_profile

相关内容