2016-08-15 17 views
0

我有一個包含一個文件:grep的字符串,從文件的報價不工作

2016-08-15 21:02:59,007: 233-670-rundeck-dispatch-script.tmp.sh: Info: Arg: -H server -S SrvCtrl,SNMP -A \"restart\" -CS \"Undefined\" -RS \"Undefined\" -CT \"Undefined\" -RT \"Undefined\" --LogServer logserver:5610 

正如我試圖尾巴的執行日誌,我檢查,如果該日誌文件包含了最新的日誌。看看這個字符串是否存在。我使用grep -F,grep的-E,grep的-FFxq 試過因此,在短期它歸結爲:

CurrentLog="2016-08-15 21:02:59,007: 233-670-rundeck-dispatch-script.tmp.sh: Info: Arg: -H server -S SrvCtrl,SNMP -A \"restart\" -CS \"Undefined\" -RS \"Undefined\" -CT \"Undefined\" -RT \"Undefined\" --LogServer logserver:5610" 

請注意,CurrentLog充滿這樣的:

CurrentLog=$(echo "$OutputTail" | jq ".entries[$EntryCoun‌​t].log" | sed -e 's/^"//' -e 's/"$//') 

意義,我可以只是單引號。

grep -Fxq "$CurrentLog" "/usr/local/nagios/libexec/DAF-988e7506-36c3-47e3-8ef2-428309e2c7f7-670.log" 

好像我需要逃避這兩個「」「和‘\’。我怎樣才能在一個命令這樣做嗎?我希望在-F不會要求我增加額外的逃避?

+2

你可能會考慮通過http://shellcheck.net/運行的代碼習慣的問題和固定它認定。一個沒有引號的擴展(即''CurrentLog' vs'「$ CurrentLog」')幾乎總是錯誤的。 –

+0

我會考慮自己的答案,但問題目前尚不完整,無法獨立評估答案是否完全正確。您可能會考慮嘗試添加一個最小的,完整的,可驗證的示例(根據http://stackoverflow.com/help/mcve) - 這涉及的一部分是構建一個包含展示正確功能所需的所有內容的示例(無關-stage'/ usr/local/nagios'文件,例如使用但未顯示;沒有提及處理輸出的日誌,但未顯示原始數據;等等),以及除去此類驗證所需的任何內容*。 –

+0

...因爲在這裏,如果您只接受來自'jq'的內容正確處理的答案,那麼您可以考慮提供一個JSON格式的原始輸入示例,這樣人們可以相應地做出回答。 –

回答

0

爲了避免轉義雙引號和反斜線,你可以使用單引號周圍的變量聲明:

CurrentLog='2016-08-15 21:02:59,007: 233-670-rundeck-dispatch-script.tmp.sh: Info: Arg: -H server -S SrvCtrl,SNMP -A \"restart\" -CS \"Undefined\" -RS \"Undefined\" -CT \"Undefined\" -RT \"Undefined\" --LogServer logserver:5610' 

測試變量的內容:

declare -p CurrentLog 
declare -- CurrentLog="2016-08-15 21:02:59,007: 233-670-rundeck-dispatch-script.tmp.sh: Info: Arg: -H server -S SrvCtrl,SNMP -A \\\"restart\\\" -CS \\\"Undefined\\\" -RS \\\"Undefined\\\" -CT \\\"Undefined\\\" -RT \\\"Undefined\\\" --LogServer logserver:5610" 

然後用它作爲:

grep -qFx "$CurrentLog" file && echo "matched" || echo "nope" 

matched 

另一種方法是使用here-doc來聲明你的變量而不用擔心引用:

read -r CurrentLog <<-'EOF' 
2016-08-15 21:02:59,007: 233-670-rundeck-dispatch-script.tmp.sh: Info: Arg: -H server -S SrvCtrl,SNMP -A \"restart\" -CS \"Undefined\" -RS \"Undefined\" -CT \"Undefined\" -RT \"Undefined\" --LogServer logserver:5610 
EOF 

,更宜避免創建一個單獨的變量和使用過程中替代:

read -r CurrentLog < <(jq -r --arg EntryCount "$EntryCount" '.entries[$EntryCoun‌​‌​‌​‌​t | tonumber].log' <<< "$OutputTail") 
+0

嘿,我不能把我的CurrentLog單引號,因爲我得到這樣的值: CurrentLog = $(echo $ OutputTail | jq「.entries [$ EntryCount] .log」| sed -e's/^「 //'-e's /「$ //') – willemdh

+0

@willemdh:在這種情況下,使用here-doc,因爲我建議使用 – anubhava

+1

@willemdh,是的,如果您正在分配的話,單引號建議是(完全正確的)一個常量字符串,這就是你在問題中表現出來的。 –

2

反斜槓需要加倍了;另外,嵌入式雙引號需要轉義(反斜槓)也因此,你最終\\\"出現在CurrentLog

CurrentLog="2016-08-15 21:02:59,007: 233-670-rundeck-dispatch-script.tmp.sh: Info: Arg: -H server -S SrvCtrl,SNMP -A \\\"restart\\\" -CS \\\"Undefined\\\" -RS \\\"Undefined\\\" -CT \\\"Undefined\\\" -RT \\\"Undefined\\\" --LogServer logserver:5610" 

,爲Charles Duffy讓我想起了在他comment,它會是最好使用單引號分配各地,因爲你不需要做任何擴展變量或命令替換:

CurrentLog='2016-08-15 21:02:59,007: 233-670-rundeck-dispatch-script.tmp.sh: Info: Arg: -H server -S SrvCtrl,SNMP -A \"restart\" -CS \"Undefined\" -RS \"Undefined\" -CT \"Undefined\" -RT \"Undefined\" --LogServer logserver:5610' 

顯然,如果你簡化了問題的字符串(例如server實際上是從一個變量擴展而來),那麼你需要重新訪問它。還要認真考慮.*的建設性用法以匹配所引用的內容。你不可能有幾個日誌,除了一個有"restart",另一個有"Undefined"在同一個字符串處。使用正則表達式是平衡什麼是相關和什麼不相關的藝術。

但總會有一個點(的地方有點你達到這種狀態之前),它是最好不過的字符串匹配到一個文件中,並使用文件和固定字符串grep匹配:

grep -F -f file-containing-pattern-line file-to-be-searched … 

然後,您不必打擊shell的引用和轉義機制(或者至少只在創建file-containing-pattern-line時)。還有'完整匹配整行'的-x選項。

別忘了加引號的話這裏的文件不會被解釋:

cat > file-containing-pattern-line << 'EOF' 
2016-08-15 21:02:59,007: 233-670-rundeck-dispatch-script.tmp.sh: Info: Arg: -H server -S SrvCtrl,SNMP -A "restart" -CS "Undefined" -RS "Undefined" -CT "Undefined" -RT "Undefined" --LogServer logserver:5610 
EOF 

你也應該考慮是否真的需要匹配了這一切。數據/時間是否足夠,或日期/時間加上腳本名稱(233-670-rundeck-dispatch-script.tmp.sh)。其中之一可能就足夠了,而且這樣做的匹配大大簡化了代碼的閱讀。

+3

如果使用單引號分配給'CurrentLog',那麼將會有相當少的打鬥。 –

+0

@CharlesDuffy:是的,也是! –

+0

由於日誌不一定以日期開始,因此我無法剪切文本。 – willemdh