如何在使用 grep -v -l "pattern"过滤的 unix 中打印前一行



我有一个文件,内容如下:

label1 name
1
label2 id
2 
label3 id
0

我正在使用 grep 扫描行,如果与模式"标签"不匹配的行的值大于 0,则会导致失败

if (grep -v -l "label" fileA) > 0
then
    echo -e "failure"
else
    echo -e "success"
fi

我还想打印那些对应于失败的值(即>0(

label1 name
label2 id

我在下面尝试过,但没有给出任何结果。我不确定,我到底哪里做错了

ps -ef | grep -v -l "label" fileA > 0

我是Unix的新手,并试图弄清楚如何打印故障线。

请帮忙

试试这个 -

$ cat f
label1 name
1
label2 id
2
label3 id
0
$ awk '/label/ {k=$0;getline tmp;print k,tmp}' f
label1 name 1
label2 id 2
label3 id 0

您可以根据需要过滤值,如下所示 -

$ awk '/label/ {k=$0;getline tmp;if(tmp > 0) {print k,tmp}}' f
label1 name 1
label2 id 2

编辑1:如果你的文件有一些没有价值的标签 -

$ cat f
label1 name
1
label2 id
2
label3 id
0
label4 id
label5 id
10
$ awk '/label/ {k=$0;getline tmp;if(tmp > 0) {print k,tmp}}' f
label1 name 1
label2 id 2
label5 id 10

通常,如果找到选定的行,则 grep 的退出状态为 0,否则为 1。我想你正在寻找grep -c

$ grep -c "label" f
3
$ echo $?
0

所以你可以做一些类似的事情

if [ $(grep -c "label" f) -gt 0 ]; then
   echo match found
fi

grep -c "label" f
if [ $? -eq 0 ]; then
   echo match found
fi

您还希望打印找到的行。您可以将这些存储在变量中。

foundlabels=$(grep "label" f)
echo "You can test on $? here, but now you have another way."
if [ -n "${foundlabels}" ]; then
   echo "failure"
   echo "${foundlabels}"
else
  echo "success"
fi

最新更新