繁体   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