使用正则表达式捕获特定字符串

6

我有多个板子。在我的bash脚本中,我想使用正则表达式捕获我的根文件系统名称。当我执行cat /proc/cmdline时,我得到了这个:

BOOT_IMAGE=/vmlinuz-5.15.0-57-generic root=/dev/mapper/vgubuntu-root ro quiet splash vt.handoff=7

我只想选择/dev/mapper/vgubuntu-root

到目前为止,我已经使用这个命令捕获了root=/dev/mapper/vgubuntu-root

\broot=[^ ]+
5个回答

7

你可以在 sed 中使用正则表达式和捕获组:

sed -E 's~.* root=([^ ]+).*~\1~' /proc/cmdline

/dev/mapper/vgubuntu-root

另一个选项是使用awk(在任何awk中都应该有效):
awk 'match($0, /root=[^ ]+/) {
   print substr($0, RSTART+5, RLENGTH-5)
}' /proc/cmdline

# if your string is always 2nd field then a simpler one
awk '{sub(/^[^=]+=/, "", $2); print $2}' /proc/cmdline

1
由于root=已经是match(...)内的一个要求,那么是否直接从RSTART +5(并从RLENGTH中扣除相同长度)直接进行substr(...)比较简单呢? - RARE Kpop Manifesto
1
谢谢,@RAREKpopManifesto(已编辑)提出了一个非常有价值的观点。 - anubhava

6

第一种解决方案:根据你在GNU awk中展示的示例,请尝试以下awk代码。

awk -v RS='[[:space:]]+root=[^[:space:]]+' '
RT && split(RT,arr,"="){
  print arr[2]
}
' Input_file

第二种解决方案:使用GNU grep,您可以尝试以下解决方案,使用-oP选项在grep中启用PCRE正则表达式,并在grep的主要部分中使用正则表达式^.*?[[:space:]]root=\K\S+,其中\K用于忘记与root=匹配的值,并获取所需的其余值。

grep -oP '^.*?[[:space:]]root=\K\S+' Input_file

第三种解决方案:如果你的Input_file总是与示例显示的一样,那么可以尝试使用字段分隔符概念的简单awk

awk -F' |root=' '{print $3}' Input_file

5
如果第二个字段有值,使用 awk 可以拆分并检查 root
awk '
{
  n=split($2,a,"=")
  if (n==2 && a[1]=="root"){
    print a[2]
  }
}
' file

输出

/dev/mapper/vgubuntu-root

或者使用带有捕获组的GNU-awk

awk 'match($0, /(^|\s)root=(\S+)/, a) {print a[2]}' file

3

由于您正在使用Linux,您可以使用GNU grep:

grep -oP '\broot=\K\S+'

o 允许匹配输出,P 将正则表达式引擎设置为 PCRE。参见在线演示详细信息:

  • \b - 单词边界
  • root= - 固定字符串
  • \K - 匹配重置操作符,丢弃到目前为止匹配的文本
  • \S+ - 一个或多个非空白字符。

1

另一个 awk 的解决方案,使用经典的 FS / OFS

-- 不需要 PCRE、捕获组、match()g/sub() 或者 substr()

echo 'BOOT_IMAGE=/vmlinuz-5.15.0-57-generic root=/dev/mapper/vgubuntu-root ro quiet splash vt.handoff=7' | 
mawk NF=NF FS='^[^=]+=[^=]+=| [^/]+$' OFS= 
/dev/mapper/vgubuntu-root

如果你非常确定这个结构有root=,那么:

gawk NF=NF FS='^.+root=| .+$' OFS= 
/dev/mapper/vgubuntu-root

如果你喜欢用 RS 的方式做,可以这样写:
nawk '$!NF = $NF' FS== RS=' [^/]+\n'
/dev/mapper/vgubuntu-root

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接