2014-03-12 34 views
-1

我想知道如何在文件中grep out(exclude)變量?如何清除文件中的變量?

例如file.txt的:

PATH1=/path/to/file 
PATH2=/path/to/anotherfile 
PATH3=/path/to/thirdfile 
TEST=$(echo $RANDOM) 

* * * * *\5 top -n 1 > /tmp/$TEST 
* * * * * echo hello # = for deletion 

我想不變量只打印cron作業: 如:

* * * * *\5 top -n 1 > /tmp/$TEST 
* * * * * echo hello # = for deletion 

注意,有在年底等號,我需要以保持這些線。 拖尾這個文件不是一個解決方案,當然可以有不止一行的變量。 有什麼想法?

+0

'grep的-v「$」'? –

回答

5

隨着vixie cron在,一個crontab行是:

  1. 如果第一個非空白評論字符是#

  2. 環境設置如果第一個非空白字符是字母o [R _

  3. 如果第一非空白字符是數字,*或@

  4. 一個空行,如果沒有非空白字符

  5. 否則,誤差的cron命令。

所以到grep的情況下3(cron命令):

grep -E '^[[:blank:]]*[0-9*@]' 

另外,除去外殼2(環境設置),但其他人留下的一切,包括註釋和錯誤:

grep -Ev '^[[:blank:]]*[a-zA-Z_]' 
+0

這似乎是回答我的情況,謝謝。 – dolevf

1

使用grep -v

grep -v '=' filename 

或者你可以grep只爲必需的條目。

$ grep '\*' filename 
* * * * *\5 top -n 1 > /tmp/$TEST 
+0

以及如果我的工作包含等號?這將無法正常工作。 – dolevf

+0

@dolevf您可以'grep'作爲cron條目。您必須提供一個特定的模式,將所需的線路與其他線路區分開來。 – Amit

+1

如果設置了所有5個數字cron參數,則第二個匹配也不起作用。 –

1

使用下面的grep這將僅排除變量設置線路:

grep -iv '^[[:blank:]]*[_a-z][_a-z0-9]*[[:blank:]]*=' 
+0

不完全;在變量名稱之前和/或之後可以有空格。但更接近。 – rici

+0

true,仍然顯示前/後的空格 – dolevf

+0

不,真正的問題是變量賦值可能在前面有空白,然後你的正則表達式會錯過這行。 – tripleee

1

我有一個答案! 你的問題讓我想你爲什麼要過濾聲明......因爲聲明不「做實際工作」。在這個意義上,他們是看不見的:)

所以我的解決辦法過濾掉類似聲明無形的命令......當然,如果這example.txt中包含rm -Rf /這將是有趣的或其他的Unix命令仍然是沒有輸出,因此您可以結合起來用某種= char搜索。

所以我的觀點是,聲明不作任何輸出,換句話說會做......這是我搞笑的回答:

$ export IFS=$'\n'; for line in $(cat /tmp/example.txt);do if [ "$(eval $line 2>&1)" != "" ];then echo "RESULT PRINTING: $line";else echo "DEF NOT PRINTING: $line";fi; done 
DEF NOT PRINTING: PATH1=/path/to/file 
DEF NOT PRINTING: PATH2=/path/to/anotherfile 
DEF NOT PRINTING: PATH3=/path/to/thirdfile 
DEF NOT PRINTING: TEST=$(echo $RANDOM) 
RESULT PRINTING: * * * * *\5 top -n 1 > /tmp/$TEST 
RESULT PRINTING: * * * * * echo hello # = for deletion 
+0

非常感謝,但這個解決方案似乎對我的具體需求有點不清楚 – dolevf