내 스크립트에 문제가 있습니다.
코드는 다음과 같습니다(줄 번호 포함).
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