1

如果我设法创建了一个充满这样行的文件......

/VAULT14/620100_V14/620054 VOL1620054

如何让 bash 比较最后的 2 * 6 位数字,例如仅在行读取时才匹配

/VAULT14/620100_V14/620054 VOL1620541

基本上我所拥有的是一个tapelabs系统上虚拟磁带的路径列表,在同一行上,该磁带的实际VOL1磁带头标签是什么。

我关心的是标签 (VOL1) 是否与实际的虚拟磁带文件名不匹配。

我确实尝试过,awk但必须遗漏一些东西:

echo "/VAULT14/620100_V14/620054 VOL1620054" | awk '{ if (substr($1,(length($1)-6)) == substr($2,(length($2)-6))) print "Same"; else print "Different" }'

Different当我认为它应该返回时返回Same

编辑: 感谢@shelter 的评论,我意识到我实际上从长度中提取了太多字符,因此/620054永远不会匹配1620054

更新的代码是:

echo "/VAULT14/620100_V14/620054 VOL1620054" | awk '{ if (substr($1,(length($1)-5)) == substr($2,(length($2)-5))) print "Same"; else print "Different" }'
4

3 回答 3

3

使用与 perl 兼容的正则表达式\d{6}\b在单词末尾(或字符串末尾)查找 6 位数字

while read line; do
    set -- $(grep -oP '\d{6}\b' <<< "$line")
    if (( $1 == $2 )); then
        echo "same -- $line"
    else
        echo "diff -- $line"
    fi
done << END
/VAULT14/620100_V14/620054 VOL1620054
/VAULT14/620100_V14/620054 VOL1620541
END
same -- /VAULT14/620100_V14/620054 VOL1620054
diff -- /VAULT14/620100_V14/620054 VOL1620541
于 2013-09-26T16:07:25.150 回答
2

你想要这样的东西:

egrep '([0-9]{6}\>).*\1$' <file>
于 2013-09-26T15:44:31.467 回答
2

纯 bash 解决方案:

#!/bin/bash

while read line; do
    if [[ $line =~ /([0-9]{6})[\ \t]+VOL[0-9]*([0-9]{6}) ]] && \
        [[ ${BASH_REMATCH[1]} = ${BASH_REMATCH[2]} ]]; then
        echo same:$line
    else
        echo different:$line
    fi
done

另存为 eg 2match,然后chmod +x 2match,然后运行:

$ cat vault.txt 
/VAULT14/620100_V14/620054 VOL1620054
/VAULT14/620100_V14/620054 VOL1620541
$ ./2match < vault.txt 
same:/VAULT14/620100_V14/620054 VOL1620054
different:/VAULT14/620100_V14/620054 VOL1620541
$ 

正则表达式可能比它需要的复杂一些 - 我不确定输入行的格式有多大的灵活性。

显然,您可以将 echo 语句更改为您想要的任何内容 - 我只是打印出相同/不同的完整行以供检查。

于 2013-09-26T15:58:31.140 回答