Print в specific part in an output

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.

11
задан 25 December 2015 в 02:57

6 ответов

Да, можно сделать это. Ваша команда была бы:

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 это помогает!

15
ответ дан 23 November 2019 в 03:49

Можно сделать это с синглом 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
11
ответ дан 23 November 2019 в 03:49

Существует много способов освежевать эту кошку, вот 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
10
ответ дан 23 November 2019 в 03:49

Что, нет perl?

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

perl будет -print каждая строка после применения сценария, данного -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
10
ответ дан 23 November 2019 в 03:49

Вот комбинация 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 флаг.
8
ответ дан 23 November 2019 в 03:49

Так как я в настоящее время учусь 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]
3
ответ дан 23 November 2019 в 03:49

Другие вопросы по тегам:

Похожие вопросы: