Bash
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 行顯示的是我迄今為止為該語句嘗試過的內容,並且我在沒有括號和驚嘆號的情況下進行了嘗試。
有什麼幫助嗎?
您可以使用退出程式碼
if grep -q -v ... if grep -v ... >/dev/null 2>&1
第一個命令會更有效,
grep -q
因為一旦找到匹配項就停止讀取輸入文件。grep
如果您跨大文件,這可能會產生很大的不同。或者(更糟)檢測到有輸出:
if [ -n "$(grep -v ...)" ]; then