Intereting Posts
Правило IPTables для любого из двух интерфейсов sfdisk не удается записать раздел на диск «Другие» разрешения на файлы как начать с моего shell-скрипта xterm, который запускает mplayer и воспроизводит файлы, которые являются аргументом скрипта Обновление Slackware 13.1 до Slackware-current, это большой скачок? хром, скомпилированный для ARM, libattr.so.1 не найден Скопировать файл в буфер обмена как text / html Reaver продолжает повторять тот же вывод на Kali linux Как запустить скрипт на удаленном хосте, когда я потеряю соединение с ним? Как предоставить разрешения другому пользователю после регистрации в качестве пользователя root в Linux? Каков самый простой способ клонирования встроенной SD-карты Linux? vfat не распознается в debian Команда для проверки доступа к файлу для другого пользователя Как вырезать все до определенного слова / после поиска в скрипте yum требует более старой версии пакета в качестве зависимости

grep для извлечения подстрок в строке

У меня есть вывод для команды, как показано ниже.

Heading1 I am one value. I am another value. I am third value. Heading2 I am some value. I am someother value. I am new value. Heading3 

Как мы видим, в начале строки есть пробел, если это не заголовок . Я пытаюсь извлечь все значения под заголовком 1. Мне нужен вывод как,

 I am one value. I am another value. I am third value. 

Если я попробую команду,

 grep mycommand | heading1 

Это дает мне только строку Heading1.

ОБНОВИТЬ:

Я знаю, мне нужно извлечь строку из начала Heading1 . Но я не знаю конечную строку (т. Е. Здесь я упомянул как Heading2, но я не буду знать).

Все, что я знаю, я должен извлечь все до следующего заголовка, который начинается в новой строке.

Примерно как это сделать:

 $ sed -n -e '/Heading1/,/Heading2/ p' file.txt | grep "^ " | sed 's/^[ ]\+//g' I am one value. I am another value. I am third value. 

Немного более сжатая версия, использует pcregrep который позволяет многолинейное соответствие:

 $ pcregrep -M 'Heading1(\n|.)*Heading2' file.txt | grep "^[ ]\+" I am one value. I am another value. I am third value. 

Чтобы избавиться от пробелов в начале, используя этот метод, вы можете использовать средство PCRE grep :

 $ pcregrep -M 'Heading1(\n|.)*Heading2' a.txt | grep -oP "^[ ]{3}\K.*" I am one value. I am another value. I am third value. 

Наконец, это решение sed и awk .

 $ sed -n -e '/Heading1/,/Heading2/ p' file.txt | awk '/^ / {sub(/^[ ]+/, ""); print}' I am one value. I am another value. I am third value. 

Это должно работать:

 yourcommand | grep -A3 Heading1 | grep -v Heading1 

Вот решение awk:

 yourcommand | awk '/Heading1/ {for(n=0; n<3; n++) {getline; $1=$1; print}}' 

Обновить

Если между Heading1 и конечной строкой только строки начинаются с пробела, вы можете сделать так:

 yourcommand | awk '/Heading1/ {flag=1;next} /^\w+/ {flag=0} {$1=$1} flag'