小编Cad*_*oux的帖子

特殊的管道 grep/head 行为

我正在帮助这里的网络管理员使用 perl 正则表达式自动操作来自我们 SAN 的一些快照,我们的脚本执行如下操作:

varinit1=$(iscsiadm -m session | grep rbmsdata1 | head -n1 | perl -pe 's/^tcp: \[\d*\] \d*\.\d*\.\d*\.\d*:\d*,\d* (iqn\..*\..*\..*:.*-.*-.*-.*-(.*-.*-\d{4}-\d{2}-\d{2}-\d{2}:\d{2}:\d{2}\.\d*\.\d*))$/$1/')

varsnap1=$(iscsiadm -m session | grep rbmsdata1 | head -n1 | perl -pe 's/^tcp: \[\d*\] \d*\.\d*\.\d*\.\d*:\d*,\d* (iqn\..*\..*\..*:.*-.*-.*-.*-(.*-.*-\d{4}-\d{2}-\d{2}-\d{2}:\d{2}:\d{2}\.\d*\.\d*))$/$2/')
Run Code Online (Sandbox Code Playgroud)

快照的签名中有两部分,一个嵌套在另一个中,我们使用捕获组来捕获名称和需要执行的不同后续命令的名称的一部分。我知道它一遍又一遍地运行相同的命令,并且可以稍后清理正则表达式,但基本上他们使用 perl 来输出一个括号和另一个。

tcp: [32] 40.40.40.101:3260,1 iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
tcp: [33] 40.40.40.101:3260,1 iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
Run Code Online (Sandbox Code Playgroud)

想要从 icsiadm 和 grep 的结果中捕捉到这个:

iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
Run Code Online (Sandbox Code Playgroud)

r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
Run Code Online (Sandbox Code Playgroud)

我们遇到的问题是,有时通往第一行的管道会失败:

head: cannot open '–n1' for reading: No such file or directory
Run Code Online (Sandbox Code Playgroud)

当然,这似乎表明 stdin to head 为空,因此它正在寻找文件名。

但它没有理由永远是空的。

如果我们做这样的事情:

varinit1=$(iscsiadm -m session | grep …
Run Code Online (Sandbox Code Playgroud)

grep scripting bash head

6
推荐指数
1
解决办法
2236
查看次数

标签 统计

bash ×1

grep ×1

head ×1

scripting ×1