打印输出中的特定部分

打印输出中的特定部分

假设有如下命令:

cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG

输出如下:

CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"

现在,我的问题是:是否有任何命令只会打印引号内的内容,即" "

您能稍微解释一下这个命令吗?谢谢!提前说一声。

答案1

是的,你可以这样做。你的命令是:

cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG | awk -F'"' '{print $2}'

仅返回:

arch/x86/configs/x86_64_defconfig

awk命令使用-F命令中的字段分隔符,要将其设置为使用双引号,请在命令中用单引号括起来,如-F'"'。然后,'{print $2}'告诉 awk 在字段分隔符后打印第二组。

希望这可以帮助!

答案2

您可以使用一个grep命令来完成此操作:

grep -Po '^CONFIG_ARCH_DEFCONFIG="\K[^"]*' /boot/config-3.19.0-32-generic

或者(更长更复杂一些):

grep -Po '^CONFIG_ARCH_DEFCONFIG="\K.*?(?=")' /boot/config-3.19.0-32-generic
  • -P:告诉grep将模式解释为 PCRE(Perl 兼容正则表达式);
  • -o:指示grep仅打印匹配的内容;
  • ^CONFIG_ARCH_DEFCONFIG=": 匹配CONFIG_ARCH_DEFCONFIG="行首的字符串;
  • \K:丢弃先前匹配的子字符串;

#1:

  • [^"]*: 不匹配任意数量的任意字符"(贪婪)。

#2:

  • .*?: 匹配任意数量的任意字符(懒惰);
  • (?="):前瞻(零长度断言,不匹配任何字符);如果后续字符是 ,则匹配"
% grep -Po '^CONFIG_ARCH_DEFCONFIG="\K[^"]*' /boot/config-4.2.0-16-generic
arch/x86/configs/x86_64_defconfig
% grep -Po '^CONFIG_ARCH_DEFCONFIG="\K.*?(?=")' /boot/config-4.2.0-16-generic
arch/x86/configs/x86_64_defconfig

答案3

解决这一问题的方法有很多,下面是其中一种sed方法:

sed -nr 's/^CONFIG_ARCH_DEFCONFIG="([^"]+)"$/\1/p' /boot/config-3.19.0-32-generic

在这里,我们匹配行并捕获所需的部分,即双引号()内的部分([^"]+),然后\1仅用捕获的组()替换整行。

例子:

% sed -nr 's/^CONFIG_ARCH_DEFCONFIG="([^"]+)"$/\1/p' /boot/config-3.13.0-32-generic
arch/x86/configs/x86_64_defconfig

答案4

grep这是和的组合cut,可以完成相同的工作。

$ grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic | cut -d"\"" -f2                                                
arch/x86/configs/x86_64_defconfig

解释:

  • grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic是查找行的部分,在标准 grep 语法中:grep [OPTIONS] PATTERN [FILE...]。输出通过管道进入下一阶段
  • cut -d"\"" -f2。此部分使用 cut 来裁剪由特定分隔符(用-dflag 指定)分隔的文本。我们必须用反斜杠转义双引号,以便 shell 允许将双引号作为命令的选项之一cut,而不是 shell 本身的输入。现在cut将 的输出视为grep由 分隔"并分成三列,CONFIG_ARCH_DEFCONFIGarch/x86/configs/x86_64_defconfig和空格。我们需要的行是第二列,这意味着我们需要使用-f2flag。

相关内容