2014-02-06 26 views
0

背景:我有一個相當簡單的bash腳本,我用它來生成CSV日誌文件。作爲bash腳本的一部分,我使用netcat來輪詢我的網絡上的其他設備。 netcat命令返回一個信息流,我可以將其轉換爲grep命令,以獲得我在CSV文件中需要的某些值。我拯救grep該返回值放入bash變量,然後在腳本的末尾,我寫出來的所有保存bash變量到CSV文件。 (很簡單。)Bash,Netcat,Pipes,perl

我想要做的改變是我必須爲每條我想省下的信息發出的netcat命令的數量。每發出一個netcat命令,我都會返回所有可能的值(因此每次都返回相同的數據,並且在網絡上負擔很重)。所以,我想只能用netcat一次,多次解析返回值,因爲我需要創建bash變量以後可以連接在一起成在CSV文件我創建一個記錄。

具體問題:使用bash語法,如果我的netcat命令的輸出傳遞給使用>(相對於當前grep方法)獲得帶有其自己的行(與\n推測分離的每個條目的文件的文件作爲EOL記錄分離器 - 易於perl正則表達式)。但是,如果我將netcat的輸出直接保存到bash變量中,並且將該變量回顯出來,則所有數據混雜在一起,因此解析出來很麻煩(並不那麼容易)。

我有兩個選擇玩:首先,我認爲一個Perl的一個班輪可能有好的解決辦法,但我不知道如何最好地執行它。僞代碼可能會將netcat輸出保存到一個bash變量,然後以某種方式弄清楚如何用perl解析它(但不是直截了當的)。

第二個選項是使用bash>並將netcat的輸出發送到文件。這將是容易perl處理和正則表達式給出的\nEOL,但這需要打開一個外部文件,並將其傳遞到perl腳本進行處理,然後以某種方式傳遞其返回值回bash腳本作爲入境bash變量進入CSV文件。

我知道我失去了一些東西簡單在這裏。有沒有一種方法,我可以強制從netcat換行符進入bash變量,然後反覆運行鍼對該變量創建各種CSV變量我需要一個Perl的一個班輪 - 所有在同一bash腳本?對不起,長期以來的問題。

+1

太多的單詞,沒有足夠的代碼 –

+0

我敢打賭,你可以將一個*特定的問題* **寫成** a *特定的問題* - 一個句子,或者兩個句子。另外,向我們展示一些代碼,輸入和輸出,並指出您的方法出了什麼問題。 – Rubens

+0

你們抱怨太多的單詞,沒有足夠的代碼...停止懶惰。 secJ試圖儘可能詳細地描述他的問題。 – Yokai

回答

0

第二個選項是使用bash's>並將netcat的輸出發送到 文件。這將是很容易與Perl來處理和正則表達式給出的\ n EOL,但這需要打開一個外部文件並將它傳遞給 Perl腳本進行處理,然後以某種方式傳遞它的返回值 回bash腳本作爲bash變量,用於輸入CSV 文件。

這實際上是一個相當常見的成語:拯救netcat的輸出在 一個臨時文件,然後使用grep或AWK或Perl或什麼都有,你作爲 根據需要多次從該文件中提取數據:

# create a temporary file and arrange to have it 
# deleted when the script exists. 
tmpfile=$(mktemp tmpXXXXXX) 
trap "rm -f $tmpfile" EXIT 

# dump data from netcat into the 
# temporary file. 
nc somehost someport > $tmpfile 

# extract some information into variable `myvar` 
myvar=$(awk '/something/ {print $4}' $tmpfile) 

最後一行示範如何獲取的東西輸出(在這種情況下,awk腳本)到一個變量。如果你使用Perl來提取一些信息,你可以做同樣的事情。

您也可以在perl中編寫整個腳本,這可能會讓您的生活更輕鬆。

+0

謝謝!最後一行正是我想要的。我知道必須有一個更簡單的方法。我同意將整個腳本轉換爲perl。我現在正在轉換它,但我需要在生產方面臨時修復。我目前正在while循環中運行腳本,因此它本身不會退出,但是我應該能夠在每次循環後在腳本中輕鬆刪除臨時文件,然後在下一次執行時重新創建它。再次感謝! – secJ