在输出中打印特定部件
让我们假设有一个命令如:
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
这是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 to crop-off文本,由特定的分隔符(用-d
标志指定)分隔。我们必须使用反斜杠转义双引号,以便shell允许双引号为cut
命令的一个选项,而不是输入到shell本身。现在cut
将把grep
输出视为"
并分成三列,CONFIG_ARCH_DEFCONFIG
,arch/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]