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

xv8emn3q  于 2023-01-18  发布在  其他
关注(0)|答案(5)|浏览(143)

我有多个开发板,在我的bash脚本中,我想使用regex捕获我的根文件系统名称。当我执行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=[^ ]+
wbgh16ku

wbgh16ku1#

您可以将sed中的正则表达式与捕获组一起使用:

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

/dev/mapper/vgubuntu-root

另一个选项是使用awk(应该在任何awk中工作):

awk 'match($0, /root=[^ ]+/) {
   s = substr($0, RSTART, RLENGTH)
   sub(/^[^=]+=/, "", s)
   print s
}' /proc/cmdline

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

zujrkrfu2#

***第一个解决方案:***使用GNU awk中显示的示例,请尝试以下awk代码。

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

***第二个解决方案:***对于GNU grep,您可以尝试以下解决方案,使用-oP选项在grep中启用PCRE regex,并在grep的主节中使用regex ^.*?[[:space:]]root=\K\S+启用PCRE regex,其中\K用于忽略root=之前的匹配值,并根据需要获取其余值。

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

***第三个解决方案:***如果您的Input_file总是与所示示例相同,请尝试使用字段分隔符的简单awk概念。

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

pn9klfpd3#

由于您使用的是Linux,因此可以使用GNU grep:

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

其中o允许匹配输出,P将正则表达式引擎设置为PCRE。请参见online demo。* 详细信息 *:

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

k3bvogb14#

如果第二个字段的值为,则可以使用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
eqfvzcg8

eqfvzcg85#

另一个awk解决方案,使用良好的OLE '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=,那么:
一个三个三个一个
如果你喜欢用RS的方式来做:

nawk '$!NF = $NF' FS== RS=' [^/]+\n'
/dev/mapper/vgubuntu-root

相关问题