2017-04-20 17 views
0

我demo.csv文件grep的內部沒有腳本的工作

data1,text1,text01 
data2,text2,text02 
data3,text3,text03 
data4,text4,text04 
data5,text5,text05 
data6,text6,text06 
data7,text7,text07 
data8,text8,text08 
data9,text9,text09 

我寫過濾掉數據的腳本demo.ksh作爲

#!/bin/ksh 
while [[ $1 = -* ]] 
do 
    case $1 in 
     --data) 
      shift 
      ARGS="$ARGS -e \"$1\"" 
     ;; 
     --excl) 
      ARGS="-v $ARGS" 
     ;; 
    esac 
    shift 
done 
echo "grep $ARGS data.csv > test.txt" 
grep $ARGS data.csv > test.txt 

demo.ksh和數據的.csv是在相同dir.demo.ksh具有+ X permission.when我運行demo.ksh作爲

demo.ksh --data data3 

輸出: demo.ksh --data data3 < - 由於腳本中的回顯

test.txt是空白文件(?不知道爲什麼) 如果我複製了由於demo.ksh中的回顯而在控制檯上打印的命令,並直接粘貼到控制檯上並按回車鍵。它運行良好並生成test.txt爲

data3,text3,test03 

爲什麼它不起作用。我錯過了什麼或在shellcript內部以錯誤的方式執行grep

+0

如果您在shell腳本中的'--data'附加了引號,該怎麼辦?你也使用$ 1作爲arg,你應該使用$ 2作爲arg。 – SMA

+0

我覺得很好。當我從腳本運行echo「grep $ ARGS data.csv> test.txt」的輸出時,直接到cmd,它的工作正常。 – Jai

+0

你不能這樣做。您將文字參數'「data3」'傳遞給'grep'而不是參數'data3',並且grep正在嘗試匹配數據中的雙引號。這裏的引用對你來說什麼都不做,事實上,如果你把你的腳本叫做'demo.ksh --data'foo bar'',那麼grep最終會在一個名爲'bar'的文件中尋找字符串'「foo'' !它相當於調用'grep -e'「foo''bar''data.csv'。 –

回答

0

-v開關否定所有內容,而不僅僅是下一個字符串。重複-v開關就像一個單一的-v開關。除非巧合,否則將-v開關添加到$ARG不能對一個字符串進行局部否定。

由於$ARGS不能包含正正則表達式和否定者的混合體,可以考慮使用兩個單獨的輸入文件來保存的搜索字符串:

#!/bin/ksh 
pos=`mktemp` 
neg=`mktemp` 
while [ "$1" ] 
do 
    case $1 in 
     --data) 
      shift 
      echo "$1" >> $pos 
     ;; 
     --excl) 
      shift 
      echo "$1" >> $neg 
     ;; 
    esac 
    shift 
done 
grep -f $pos data.csv | grep -v -f $neg > test.txt 
rm $pos $neg 

demo.ksh語法一直保持不變,但它的不是很好的語法,因爲沒有前面的--excl--data的任何搜索字符串或文件名都會丟失。