在输出中打印特定部件

让我们假设有一个命令如:

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

输出如下:

 CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig" 

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

你能解释一下这个命令吗? 谢谢! 提前。

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

 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在字段分隔符后打印第二组。

希望这可以帮助!

您可以使用单个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:

  • .*? :匹配任何数字的任何字符(懒惰);
  • (?=") :lookahead(零长度断言,它与任何字符都不匹配);匹配如果以下字符是"
 % 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 

这种猫的皮肤有很多方法,这里有一种方法:

 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 

什么,没有perl

 grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generic | perl -pe 's/.*?"([^"]*).*/$1/' 

在应用-e给出的脚本后, perl-p rint每行。 s/foo/bar/将用bar替换foo 。 括号中的模式被“捕获”,可以称为$1$2$N ,其中$1是捕获的第一个模式, $2是第二个等等。正则表达式将查找所有内容,直到第一个引号( .*?" ),然后捕获0个或更多非"字符( [^"]* ),然后捕获其他所有内容。整个事物被捕获的模式替换。

您还可以将模式匹配留给perl

 perl -ne 's/.*CONFIG_ARCH_DEFCONFIG="([^"]*).*/$1/ && print' /boot/config-3.19.0-32-generic 

这是grepcut的组合,可以完成相同的工作。

 $ 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 to crop-off文本,由特定的分隔符(用-d标志指定)分隔。我们必须使用反斜杠转义双引号,以便shell允许双引号为cut命令的一个选项,而不是输入到shell本身。现在cut将把grep输出视为"并分成三列, CONFIG_ARCH_DEFCONFIGarch/x86/configs/x86_64_defconfig ,以及空格。 我们需要的行是第二列,这意味着我们需要使用-f2标志。

因为我目前正在学习python这是一个使用它的版本。

 #!/usr/bin/env python import re reg = re.compile('CONFIG_ARCH_DEFCONFIG') with open("/boot/config-3.19.0-32-generic") as file : for line in file: if reg.match(line): print line.split('"')[1] 

样品运行:

 DIR:/TECH-BOOKS skolodya@ubuntu:$ ./extractString.py arch/x86/configs/x86_64_defconfig DIR:/TECH-BOOKS skolodya@ubuntu:$ cat ./extractString.py #!/usr/bin/env python import re reg = re.compile('CONFIG_ARCH_DEFCONFIG') with open("/boot/config-3.19.0-32-generic") as file : for line in file: if reg.match(line): print line.split('"')[1]