![](/img/trans.png)
[英]How do you filter (and replace) phone# input if javascript disabled and you want (XXX)XXX-XXXX exactly, in PHP or Regex
[英]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
我相當有信心grep 、 sed和awk (以及大多數符合 POSIX 的實用程序)不支持\w
和\d
。 這些是類似 Perl 的標志。 您可以將-E
傳遞給grep和sed以讓它們使用擴展的正則表達式(這將使您不必進行盡可能多的轉義)。
將匹配項寫入文件似乎是重用它的最佳方式。 使用>>
確保我們將 append 寫入文件,這樣grep只會將匹配的表達式寫入文件,而不會用空文件覆蓋它。 這就是為什么有必要刪除腳本末尾的文件(這樣下次運行時它不會搞砸,也不會留下不必要的文件)。 在許可證上傳命令中,我們使用cat將 output 文件的內容內聯。 我還將 tail 命令更改為tail -Fn1
,因為我很確定您至少需要 1 才能將一行輸入 grep。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.