如果在第“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