假设有如下命令:
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 来裁剪由特定分隔符(用-d
flag 指定)分隔的文本。我们必须用反斜杠转义双引号,以便 shell 允许将双引号作为命令的选项之一cut
,而不是 shell 本身的输入。现在cut
将 的输出视为grep
由 分隔"
并分成三列,CONFIG_ARCH_DEFCONFIG
、arch/x86/configs/x86_64_defconfig
和空格。我们需要的行是第二列,这意味着我们需要使用-f2
flag。