Bash

grep -v 沒有輸出?

  • April 25, 2020

我的腳本有問題。

這是程式碼(帶行號):

 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

引用自:https://unix.stackexchange.com/questions/582372