grep -v 没有输出?

grep -v 没有输出?

我的脚本有问题。

这是代码(带有行号):

  1 function usage
  2 {
  3  echo "usage: $0 filename ..."
  4  echo "ERROR: $1"
  5 }
  6
  7 if [ $# -gt 0 ]
  8 then name=(name hidden for security purposes)
  9  echo $name
 10  date
 11  for starting_data
 12  do
 13   echo ""
 14   if [ -f $1 ]
 15   then if !(grep -v "[0-9]\{3\}-[0-9]\{2\}-[0-9]\{4\}, [a-zA-Z]\+, [a-zA-Z]\+" $1)
 16    then starting_data=$1
 17     echo "$1"
 18     sed '/^id/ d' $starting_data > rawdata
 19     cut -f1 -d, rawdata > rawdata.col1
 20     cut -f2 -d, rawdata > rawdata.col2
 21     cut -f3 -d, rawdata > rawdata.col3
 22     sed 's/-//' rawdata.col1 > raw1
 23     sed 's/-//' raw1 > rawfinal1
 24     sed 's/$/:/' rawdata.col2 > raw2
 25     sed 's/ //' raw2 > rawfinal2
 26     sed 's/ //' rawdata.col3 > raw3
 27     more raw3 > rawfinal3
 28     paste -d\  rawfinal3 rawfinal2 rawfinal1 > final
 29     more final
 30     rm rawdata rawdata.col1 rawdata.col2 rawdata.col3 raw1 raw2 raw3 rawfinal1 rawfinal2 rawfinal3 final
 31     shift
 32    else usage "Invalid data in $1"
 33     shift
 34    fi
 35   else usage "Could not find file $1"
 36    shift
 37   fi
 38  done
 39 else usage "Please enter a filename."
 40 fi

我遇到问题的关键行是第 15 行。我希望它找到与正则表达式不匹配的行,但不输出。在我的作业中,我需要使用来grep -v查找这些行,但它所做的只是输出与正则表达式不匹配的行。我想要它做的是显示用法语句,如果它发现与预期的 grep 语句不匹配的行,则显示有关无效文件数据的错误。 (列出的正则表达式在正确的文件中确实匹配正确,不用担心。)

简而言之,我想要做的是,如果grep -v在文件中找到与正则表达式不匹配的行,我希望它不显示输出,而只显示我的错误语句。

当我打字时我得到什么./[scriptname] raw_data more_bad_data more_data bad_data raw_data2 additional_bad_data

我得到(注意:名称中带有 bad_data 的任何内容都应该仅显示用法语句和错误):

(name hidden for security purposes)
Fri Apr 24 20:23:54 PDT 2020

raw_data
[correct output]

[more_bad_data grep -v output]
usage: ./hw12.sh filename ...
ERROR: Invalid data in more_bad_data

more_data
[correct output]

[bad_data grep -v output]
usage: ./hw12.sh filename ...
ERROR: Invalid data in bad_data

raw_data2
[correct output]

[additional_bad_data grep -v output]
usage: ./hw12.sh filename ...
ERROR: Invalid data in additional_bad_data

当前第 15 行显示的是我迄今为止对该语句所尝试过的内容,并且我尝试了不带括号和感叹号的操作。

有什么帮助吗?

答案1

您可以使用退出代码

if grep -q -v ...
if grep -v ... >/dev/null 2>&1

第一个命令会更有效,因为grep -q一旦找到匹配项就停止读取输入文件。如果您grep处理大型文件,这可能会产生很大的差异。

或者(更糟糕)检测到有输出:

if [ -n "$(grep -v ...)" ]; then

相关内容