如何匹配 fstab 文件中的行

如何匹配 fstab 文件中的行

/etc/fstab我们在文件中有以下行

/dev/mapper/vg_D /data/container xfs     defaults        0 0

但是当我们尝试将行匹配为

LINE=/data/container

grep -qxF "$LINE" /etc/fstab || echo "line not in file !!!"
line not in line !!!

似乎与 grep -qxF线路不匹配/data/container

我们哪里错了?以及如何搭配线路?

答案1

不要使用该-x参数,它会尝试匹配整行

       -x, --line-regexp
              Select only those matches that exactly match the whole  line.   For  a  regular  expression
              pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $.

所以它只会匹配只包含/data/container其他内容的行。

答案2

您应该使用 awk 而不是 grep 来提高鲁棒性,因为您当前的 grep 方法即使部分修复以消除-x,即使您通过添加进一步修复它-w仍然会产生错误匹配。将 grep 命令替换为:

awk -v line="$LINE" '$2==line{exit 1}' /etc/fstab

或者更好的是从 awk 中进行打印:

awk -v line="$LINE" '
    $2==line { f=1; exit }
    END { print (f ? "line inf file" : "line not in file"); exit !f }
' /etc/fstab

如果"$LINE"可以包含反斜杠则使用:

line="$LINE" awk '$2==ENVIRON["line"]...'

例如,而不是line使用 awk设置-v,因此 awk 不会转换为制表符。\t

相关内容