LINUX.ORG.RU

[bash] объединение функций grep и sed (для новичка)

 


0

1

Всем доброго дня! Сильно меня не бить, я новичок и только неделю изучаю bash. Вопрос кроется в том что есть у меня ассемблерный код, в нем заложены некие функциональные блоки. Моя задача - записать в ЛОГ один из этих блоков, причем полностью.

Я пока пришел к выводу что заглавие этого функционального блока я могу найти командой grep, задав нужный мне шаблон: grep -iE '^[[:digit:]a-f]+[[:space:]]+<_[^>]+>' *.txt Но мне нужно не только название, а и весь его функциональный блок. Функциональный блок я могу себе залогировать с помощью команды sed, задав слово для поиска и оно мне выведет весь параграф с этим словом: sed -e '/./{H;$!d;}' -e 'x;/'слово для поиска'/!d;' *.txt по отдельности эти команды работают, но как заставить sed распознавать тот текст который grep нашел по шаблону? Уже и переменный вставлял, и саму команду прописывал в сед, и пайп пробовал ставить, но везде выдает ошибку: sed: -e expression #*, char *: unterminated address regex. Куда копать - хз, по «man» мне пока тяжело ориентироваться. Либо есть какие то альтернативные решения для моей задачи?

Благодарю всех за внимание.

Например, grep может выдать номер строки, а его подставишь в sed.

Либо дай пример - можно попробовать awk/perl.

unsigned ★★★★
()
$ echo -e 'qwe\nrty\nuio\nasd\nfgh\njkl\nzxc\ncvb\nnmp'
qwe
rty
uio
asd
fgh
jkl
zxc
cvb
nmp
$ echo -e 'qwe\nrty\nuio\nasd\nfgh\njkl\nzxc\ncvb\nnmp' | sed -n '/uio/,/zxc/p'
uio
asd
fgh
jkl
zxc
sdio ★★★★★
()
Ответ на: комментарий от unsigned

grep мне выдал нужные слова по шаблону и их я хочу вставить в команду с sed, но там слова могут быть различные и я хочу чтоб оно мне само подбирало на вывод исходя из вывода grep. awk и perl я пока не осилил, если можно то приведите пример моей задачи на awk. Спасибо

arthur_s
() автор топика
Ответ на: комментарий от Zhbert

идеальным было бы показать на примере как оно работет само объединение с помощью пайпа и что именно в sed нужно правильно вводить в sed -e '/./{H;$!d;}' -e 'x;/'слово для поиска'/!d;' чтоб оно правильно понимало вывод grep. А так синтаксическая ошибка регэкспа

arthur_s
() автор топика

Я пока пришел к выводу что заглавие этого функционального блока я могу найти командой grep, задав нужный мне шаблон: grep -iE '^[[:digit:]a-f]+[[:space:]]+<_[^>]+>' *.txt Но мне нужно не только название, а и весь его функциональный блок. Функциональный блок я могу себе залогировать с помощью команды sed, задав слово для поиска и оно мне выведет весь параграф с этим словом: sed -e '/./{H;$!d;}' -e 'x;/'слово для поиска'/!d;' *.txt по отдельности эти команды работают, но как заставить sed распознавать тот текст который grep нашел по шаблону?

1. зачем так наворочено?

2. зачем использовать sed -e " -e "?

3. зачем использовать sed 'H'?

4. зачем вообще тут grep??? Вставьте шаблон вместо первой точки в sed скрипте

5. Вы таки издеваетесь, или sed-скрипты где-то нагуглили?

6. дословно ваша задача решается просто HEAD=`grep "`; sed «/$HEAD/...»

7. http://drbatty.ru/sed/

drBatty ★★
()

задача звучит просто - по шаблону grep'а распечатать абзацы sed'ом, но у меня страдает практическая часть, bash учу неделю и с командной строкой работаю только вторую неделю.

arthur_s
() автор топика
Ответ на: комментарий от drBatty

Таки да, команду sed я нагуглил, так как не разобрался с ней еще, а данный скрипт выводит мне нужный результат. Было бы еще плюсом если бы вы мне его объяснили что к чему. Мануалы на английском читаются мною пока тяжело((((. Спасибо за помощь.

arthur_s
() автор топика
Ответ на: комментарий от drBatty

Задача в общем то описана в шапке. Есть некий дизассемблированый код который я занес в текстовик. С этого кода мне нужно найти заголовки нужных мне блоков (в частности этот шаблон я задал grep'ом) и полностью перенести этот блок (заголовок + весь к нему нужный текст до пустой строки) в отдельный текстовик. Вот и все впринципе

arthur_s
() автор топика
Ответ на: комментарий от arthur_s

>задача звучит просто - по шаблону grep'а распечатать абзацы sed'ом, но у меня страдает практическая часть

задача неполная и неправильная. Дело в том, что grep это недоделанная sed. Упрощённый вариант.

Например grep 'word' эквивалентно sed '/word/!d'

ЗЫЖ по моей ссылке по-русски. В частности русский перевод man sed & info sed.

drBatty ★★
()
Ответ на: комментарий от arthur_s
ksu@ksu:~$ sed '' test.txt 
aaa
key
bbb
ccc
ddd

key
bbb
ddd

xxx
xxx
ksu@ksu:~$ sed '/key/,/^$/!d' test.txt 
key
bbb
ccc
ddd

key
bbb
ddd

drBatty ★★
()
Ответ на: комментарий от drBatty

Спасибо за ссылку, сейчас ознакамливаюсь. по поводу задачи, абстрактно. Есть у нас текстовый файл, в нем рассказ, который в свою очередь состоит из нескольких абзацев. Задача - найти и вывести на экран те абзацы где первая строка абзаца начинается с цифры и заканчивается двоеточием (:). Так понятна задача?

arthur_s
() автор топика
Ответ на: комментарий от arthur_s

хотите извращений? их есть у меня:

$ grep -n 'key' test.txt | while read NUM; do NUM=${NUM%:*}; echo $NUM; sed -n "$NUM,/^$/p" test.txt; done
2
key
bbb
ccc
ddd

7
key
bbb
ddd

Как раз ваш вариант - получить grep'ом номер строки, и выделить кусок sed'ом. Согласитесь - удаление гланд ректально.

drBatty ★★
()
Ответ на: комментарий от drBatty

Задача - найти и вывести на экран те абзацы где первая строка абзаца начинается с цифры и заканчивается двоеточием (:). Так понятна задача?

sed -n '/^[0-9].*:$/,/^$/p'
drBatty ★★
()
Ответ на: комментарий от drBatty

В общем нужно чтоб сед фильтровал абзацы с заглавной строкой такого типа, пример: 00028c <_test3function>: При этом при введении в sed текста test3 он мне фильтровал этот абзац.

arthur_s
() автор топика
Ответ на: комментарий от drBatty

drBatty, Ваша команда sed -n '/^[0-9].*:$/,/^$/p' выводит мне то что я прописывал sed -e '/./{H;$!d;}' -e 'x;/'слово для поиска'/!d;' но как мне реализовать правильно в ней шаблон и только внутри шаблона текст который примерно я хочу ввести (допустим тот же test3)? Я Вам очень признателен за содействующую помощь.

arthur_s
() автор топика
Ответ на: комментарий от arthur_s

>но как мне реализовать правильно в ней шаблон и только внутри шаблона текст который примерно я хочу ввести (допустим тот же test3)

в смысле это как? что-бы в первой строчке присутствовало test3? sed -n '/^[0-9].*test3.*:$/,/^$/p'

drBatty ★★
()
Ответ на: комментарий от drBatty

немножко не то, чтоб был шаблон в виде /^[[0-9]a-f]+[[space]]+<_.*test3.*>:$/,/^$/p. Вот только как правильно отобразить пробел и знаки в слове?

arthur_s
() автор топика
Ответ на: комментарий от arthur_s

>немножко не то, чтоб был шаблон в виде /^[[0-9]a-f]+[space]+<_.*test3.*>:$/,/^$/p. Вот только как правильно отобразить пробел и знаки в слове?

пробел, табуляция, перевод строки, возврат коретки это [[:space:]] или \s

шестнадцетеричная цифра [[:xdigit:]] или [0-9a-fA-F]

и если вы не хотите экранировать плюсы (а вы не хотите), используйте sed -r. Это как grep -E.

drBatty ★★
()
Ответ на: комментарий от arthur_s

еще такой нюанс, название блока который обфусцировался я знаю частично, вот мне его и надо выцарапать из заголовка и залогировать весь блок.

arthur_s
() автор топика
Ответ на: комментарий от arthur_s

ни у кого больше нет идей как можно вырезать нужные потоки информации по заглавному шаблону?

arthur_s
() автор топика

Вы бы хотя бы выложили кусочек текста - а то так регулярку тяжело написать по словам - нужно хорошо знать исходный текст.

s1392781
()
Ответ на: комментарий от drBatty

Сорри, но на это я не могу ответить.

примерно такой вид:

00428214413 <_какойто_текст>:

4223 fdfff23249 ffedwife 4231 gdgdgggdk rre3fef99 4293 fdgggko30 fgdgdfdfe

и так далее и по несколько блоков разделенных пустой строкой

arthur_s
() автор топика
Ответ на: комментарий от arthur_s

Сорри, но на это я не могу ответить.

примерно такой вид:

00428214413 <_какойто_текст>:

4223 fdfff23249 ffedwife 4231 gdgdgggdk rre3fef99 4293 fdgggko30 fgdgdfdfe

и так далее и по несколько блоков разделенных пустой строкой

ну сделайте что-то похожее, и напишите что должно получится.

drBatty ★★
()
Ответ на: комментарий от Neksys

всем спасибо за помощь, вопрос практически решен, осталось уложить пару моментов по коду.

Использовал тот код что я изначально указал из своих, а именно СЕД с регэкспами

arthur_s
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.