Cad*_*oux 6 grep scripting bash 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 rbmsdata1 | head -n1)
varsnap1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)
Run Code Online (Sandbox Code Playgroud)
第二个将失败,第二个变量将为空。
然而,如果我们反转它们,那么 varsnap1 将失败:
varsnap1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)
varinit1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)
Run Code Online (Sandbox Code Playgroud)
这是非常奇怪的,我们无法弄清楚发生了什么。当我们从命令行运行 iscsiadm 命令和 grepping 之后,每次运行都会返回相同的内容。
是不是有什么东西弄乱了管道?
RedHat Enterprise Linux 上的 head 版本 5.97
虽然您的问题可能包含错误(长 utf8 破折号而不是正常的破折号):
\n\n$ head \xe2\x80\x93n1\nhead: cannot open \xe2\x80\x98\xe2\x80\x93n1\xe2\x80\x99 for reading: No such file or directory\n$ head -n1 # ctrl-d\n$ \nRun Code Online (Sandbox Code Playgroud)\n\n我认为这只是浏览器的问题,因为只有一次是这样的。head无论如何,在需要时等待输入。head -n1尝试用以下之一替换:
sed -n 1p\nawk 'NR==1 {print}' # yay, no potential dash problems\nRun Code Online (Sandbox Code Playgroud)\n\n好的,还有很多方法可以做到这一点,但您也可以跳过该管道元素,只grep通过添加参数来告诉仅返回第一个匹配项-m 1。或者消除两个元素并告诉perl仅在第一个匹配行上进行操作。