簡體   English   中英

你如何 pipe 並從尾部過濾文本作為腳本中變量的輸入?

[英]How do you pipe and filter text from tail as input for a variable in a script?

背景故事

我正在嘗試創建一個腳本,通過設備 cli 更新“設備”,但在建立 ssh 連接后它不接受任何形式的命令。 出於這個原因,我已經開始使用屏幕從設備上記錄 output,然后嘗試過濾日志中的相關信息,這樣我就可以通過將命令填充到屏幕緩沖區來將命令傳回遠程設備。(有點搖搖欲墜的做事方式它,但它所有我能想到的。

問題我需要使用 grep 和 sed 或 awk 的一些組合來過濾掉我正在尋找的兩個輸出之一,分別是 "SN12345678" '\w[a-zA-Z]\d{6-10}' 和 "finished “在 screenlog.2 中,我有這兩個的正則表達式模式,但我似乎無法獲得正確的 output 並將其分配給變量

.screenrc(相關摘錄)

screen -t script 0 ./script
screen -t local 1 bash
screen -t remote 2 bash
screen -t Shell 3 bash

。/腳本

screen -p 2 -X log on #turns logging on window 2
screen -p 3 -X stuff 'tail-Fn 0 screenlog.2 | #SOMESED Function that i cant figure out'
screen -p 2 -X stuff 'ssh -o "UserKnownHostsFile /dev/null" -o "StrictHostKeyChecking=no" admin@192.168.0.1^M' && echo "Stuffed ssh login -> window 2"
sleep 2 # wait for ssh connection
screen -p 2 -X stuff admin^M && echo "stuffed pw"
sleep 4 # wait for auth
screen -p 2 -X stuff "copy sw ftp://ftpuser:admin@192.168.0.2/dev_uimage-4_4_5-26222^M" && echo "initiated flash"
screen -p 2 -X stuff "copy license ftp://ftpuser:admin@192.168.0.2/$(result of sed from screenlog.2).lic^M" && echo "uploading license"

抱歉,如果這有點啰嗦,過去幾天我一直在絞盡腦汁,試圖讓它發揮作用。 感謝您的時間!

回答

正則表達式

查看您提供的示例正則表達式,我將假設SN不能只是硬編碼,並且它可能是第一個字符的大寫、小寫、數字和第二個數字的大寫、小寫,所以我認為您正在尋找:

grep -Eo '[[:alnum:]][[:alpha:]][[:digit:]]{6,10}' # Works regardless of computer's local settings
# OR
egrep -o '[[:alnum:]][[:alpha:]][[:digit:]]{6,10}' # Works regardless of computer's local settings

# OR

grep -Eo '[0-9A-Za-z][A-Za-z][0-9]{6,10}'
# OR
egrep -o '[0-9A-Za-z][A-Za-z][0-9]{6,10}'

這些是您的正則表達式的精確轉換(包括_作為第一個字符的可能性):

grep -Eo '[[:alnum:]_][[:alpha:]][[:digit:]]{6,10}' # Works regardless of computer's local settings
# OR
grep -Eo '[0-9A-Za-z_][A-Za-z][0-9]{6,10}'
# OR (non-extended regular expressions)
grep -o '[[:alnum:]_][[:alpha:]][[:digit:]]\{6,10\}'
grep -o '[0-9A-Za-z_][A-Za-z][0-9]\{6,10\}'

重復使用比賽

我不知道你如何將 output 分配給一個變量,但我只是將它寫入一個文件然后刪除該文件(假設“腳本”和“Shell”windows 具有相同的密碼 [當前工作目錄]) :

. . .
screen -p 3 -X stuff 'tail -Fn1 screenlog.2 | grep -Eo "[[:alnum:]][[:alpha:]][[:digit:]]{6,10}" >> SerialNumberOrID^M'
. . .
screen -p 2 -X stuff "copy license ftp://ftpuser:admin@192.168.0.2/$(cat SerialNumberOrID).lic^M" && echo "uploading license"
rm -f SerialNumberOrID

解釋

正則表達式

我相當有信心grepsedawk (以及大多數符合 POSIX 的實用程序)不支持\w\d 這些是類似 Perl 的標志 您可以將-E傳遞給grepsed以讓它們使用擴展的正則表達式(這將使您不必進行盡可能多的轉義)。

命令更改

將匹配項寫入文件似乎是重用它的最佳方式。 使用>>確保我們將 append 寫入文件,這樣grep只會將匹配的表達式寫入文件,而不會用空文件覆蓋它。 這就是為什么有必要刪除腳本末尾的文件(這樣下次運行時它不會搞砸,也不會留下不必要的文件)。 在許可證上傳命令中,我們使用cat將 output 文件的內容內聯。 我還將 tail 命令更改為tail -Fn1 ,因為我很確定您至少需要 1 才能將一行輸入 grep。

資源

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM