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

voi*_*ain 6 regex linux grep sed

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

BOOT_IMAGE=/vmlinuz-5.15.0-57-generic root=/dev/mapper/vgubuntu-root ro quiet splash vt.handoff=7
Run Code Online (Sandbox Code Playgroud)

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

到目前为止我已经成功地root=/dev/mapper/vgubuntu-root使用这个命令

\broot=[^ ]+
Run Code Online (Sandbox Code Playgroud)

anu*_*ava 7

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

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

/dev/mapper/vgubuntu-root
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用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
Run Code Online (Sandbox Code Playgroud)


Rav*_*h13 6

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

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

第二个解决方案:使用 GNUgrep,您可以尝试以下解决方案,使用使用的主要部分中-oP启用 PCRE 正则表达式,其中用于忘记匹配的值直到并根据需要获取其余值。grepgrep^.*?[[:space:]]root=\K\S+\Kroot=

grep -oP '^.*?[[:space:]]root=\K\S+' Input_file
Run Code Online (Sandbox Code Playgroud)

第三种解决方案:如果您的 Input_file 始终与所示示例相同,则尝试awk使用字段分隔符概念简单。

awk -F' |root=' '{print $3}' Input_file
Run Code Online (Sandbox Code Playgroud)


The*_*ird 5

如果第二个字段有值,使用 awk 可以拆分并检查root

awk '
{
  n=split($2,a,"=")
  if (n==2 && a[1]=="root"){
    print a[2]
  }
}
' file
Run Code Online (Sandbox Code Playgroud)

输出

/dev/mapper/vgubuntu-root
Run Code Online (Sandbox Code Playgroud)

或者GNU-awk与捕获组一起使用

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