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

관련 정보