Let us suppose that there is в command such схвати:
cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG
The output is схвати such:
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
Now, my question is: Пашите there any commands which will only print what is inside the неопрокиньте commas, i.e., " "
?
And could you please explain the command в little? Thank you! in advance.
Да, можно сделать это. Ваша команда была бы:
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 печатать второй набор после разделителя полей.
Hope это помогает!
Можно сделать это с синглом grep
команда:
grep -Po '^CONFIG_ARCH_DEFCONFIG="\K[^"]*' /boot/config-3.19.0-32-generic
Или (немного дольше и больше convulted):
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:
.*?
: соответствия любое количество любого символа (лениво); (?=")
: предвидение (обнуляют-lenght утверждение, оно не соответствует никакому символу); соответствия, если следующий символ "
. % 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
путь:
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/'
perl
будет -p
rint каждая строка после применения сценария, данного -e
. s/foo/bar/
займет место foo
с bar
. Шаблоны в круглых скобках "получены" и могут упоминаться как $1
, $2
... $N
где $1
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
. Эта часть использует сокращение для обрезки - от текста, разделенного определенным разделителем (который указан с -d
флаг). Мы должны выйти из двойной кавычки с обратной косой чертой так, чтобы оболочка позволила брать двойную кавычку в качестве одной из опций к cut
команда, вместо того, чтобы ввести к самой оболочке. Теперь 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]