LINUX.ORG.RU

Ответ на: комментарий от anonymous

исходный код чего? текста? ну типа так

2341243
йцукйцук бла1 йцйцук
ффыва
яс1
ыфпй
ывап бла2 ывапывап
2 грепа и .* не ищут эти 2 строки

wolverin ()
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от wolverin

Ты что-то путаешь.

Возможны два варианта:
1) Найди все строки, в которых есть бла1 или бла2: egrep "бла1\|бла2"
2) Найди все строки, которые содержат и бла1 и бла2: egrep "бла1.*бла2\|бла2.*бла1".

Третьего не дано.

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

Написал бы технически грамотно, здесь бы не было этих никому не нужных советов с одним грепом

futurama ★★★★ ()
# список файлов с 'blah1'
grep -l 'blah1' ./*.txt > f1
# список файлов с 'blah2'
grep -l 'blah2' ./*.txt > f2
# список файлов с 'blah1' и 'blah2'
grep -wF -f f1 f2 > f1a2

# сам: вывод из списка "f1a2" в нужном формате 
futurama ★★★★ ()
Ответ на: комментарий от wolverin

вот такая штука почти прокатывает, но лишнее имя файла торчит

grep "бла1\|бла2" ./*.txt | awk '{ ORS = (NR%2 ? ":" : RS) } 1'
не, не пойдет, какое то из условий же может не существовать

wolverin ()
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от wolverin

точно! но нужно для списка файлов, читаю за paste

https://www.opennet.ru/docs/RUS/bash_scripting_guide/

P. S. Если файлы только из текущего каталога, find излишен. Но я не знаю деталей твоего кейса.

for F in $( find -maxdepth 1 -iname "*.txt" ); do
  R=$( grep "one\|two" "$F" | paste -sd ":" - | grep "one" | grep "two" )
  [[ -n "$R" ]] && echo "$F $R"
done

Kroz ★★★★★ ()

А что должен выводить скрипт с паттерном «one\|two» для такого файла?

11 one
11 one
11 one
11 one
11 one
11 one
11 one
11 one
11 one
22 two
33 three
44 four
55 five
anonymous ()
Ответ на: комментарий от Kroz

Даа, лучше бдсмить бинутилсы же. Сколько лет читаю такие треды, все недоумеваю, почему люди не могут просто взять любой элементарный яп, забрать стпоки из файлов в нормальные структуры данных и делать с ними что душе угодно. Даже если у человека сложности с алгоритмированием, все ваши пастогрепоседоавки можно было сделать модулем на яп и никогда не парить себе мозг, но вы уплетаете непотребное стд легаси, созданное для ручного ввода с консоли, когда больше вообще нихрена не было, и кормите им людей. Чем-то похоже на работу верстальщика css – есть куча мелких блоков, которые не делают что нужно, но если вложить 4 штуки и прописать 50 свойств, то получается почти что надо, осталось только px вручную подобрать. Или как целиком на sql-е пишут бизнес-логику, копируя целые трехстраничные запросы по пять раз в третий уровень вложения, потому что нет элементарного препроцессора или разделения на функции.

На яп задача решается так: идешь по файлам тек.папки, идешь по строкам, если /а|б/, то кладешь строку в массив. Потом массив добиваешь до четного и попарно соединяя, добавляешь имя файла, принтишь. Всё, никаких недокостылей, а с хорошей файл-либой будет строк 10 от силы.

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

s/бинутилсы/кореутилсы/, все время путаю

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

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

Шелл в *nix это и есть ЯП, а не как в венде какое-то говно.

На яп задача решается так: идешь по файлам тек.папки, идешь по строкам, если /а|б/, то кладешь строку в массив. Потом массив добиваешь до четного и попарно соединяя, добавляешь имя файла, принтишь.

Да, на шелле элементарно можно написать такой однострочник.

Всё, никаких недокостылей, а с хорошей файл-либой будет строк 10 от силы.

*utils и есть «либы» для ЯП «шелл».

ЗЫ: Не осилил баш - вали на венду.

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

Шелл простой, а твои ЯП общего назначения - сложные. Но если хочешь, можешь предложить свое решение, пользуясь мощными современными средствами, например на электроне.

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

А что должен выводить скрипт с паттерном «one\|two» для такого файла?

в файле только 1 значение может быть каждой строки


похоже простого решения нет, пришлось грепать в цикле второй раз, щас файлов 1.5 тыщи, а будет 10... грусть печаль

wolverin ()
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от legolegs

Шелл простой

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

anonymous ()
Ответ на: комментарий от Kroz

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

anonymous ()
Ответ на: комментарий от wolverin

Выглядит как задача для awk. Если время будет днём черкну скриптик.

А что, если одного из паттернов в файле нет вовсе?

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

legolegs

awk тоже гуглил, когда всегда 2 есть, то можно сделать, почти пример выше, а если нет второго (что теоретически может быть, но на практике наверное нет), то получается каша

точнее так исхожу - первый если есть, то и второй должен быть (первого может не быть)

wolverin ()
Последнее исправление: wolverin (всего исправлений: 2)
Ответ на: комментарий от wolverin

вообще это логи кучи gsm-модулей в псевдо xml, когда был 1 параметр проблем не было извлечь куда надо залить, тут вот еще один понадобился.

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

Прям совсем псевдо- или нормальным парсером парсится?

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

На шеле задачи решают пошаговым методом. Один греп, посмотрели результат, добавили еще сед, например, посмотрели и так далее. Если приходим к сложному и трудоемкому решению, переходим на ЯП типа перл, при этом уже имеем наработки что искать и как оно выглядит. Так что всему свое время и место

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

На ЯВУ эти седы и грепы это тоже вызов одной функции, тоже так на них задачи решаю.

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

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

Шелл - это отличный инструмент. Для своего круга задач. Именно потому, что в нем по-быстрому можно сделать много чего, например, решить задачу TC.

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

Бгг. И тут выясняется, что это «псевдо-xml». :)

Так парси тем же шеллом этот псевдо-xml и там уже разбирайся с нужными тебе элементами.

Тупой парсер xml и подобных на шелле достаточно легко делается:

$ cat xmlparse.sh 
#!/bin/sh

rdom () { local IFS=\> ; read -d \< T V ; }

while rdom; do
    case $T in
        /* | \?* )
            ;;
        *)
            V=`echo "$V" | xargs`
            [ "$V" != "" ] && {
                echo $T \"$V\"
            }
            ;;
    esac
done

Вместо echo $T \«$V\» напиши свою обработку нужных тебе тегов, или в варианты case добавь нужные тэги, да и всё.

Stanson ★★★★★ ()
Последнее исправление: Stanson (всего исправлений: 2)
Ответ на: комментарий от Stanson

Stanson

это все хорошо и замечательно, но зачем этот огород городить, когда мне нужно 2 конкретных значения, все конечно можно сделать вон как анонимус советует еще яп писать

нужно простое решение В СТРОКУ командой, которую я уже отправляю на цикл, а уже он чего надо заливает, без создания файлов из файлов и прочего бреда

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

псевдо - потому что часть строк с тегами, часть просто построчный «мусор»

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

Ну, как-то так (работает только с GNU awk) (да, это ОДНА команда шелла, можно копипастить целиком):

gawk -v OFS=":" '
  /one/ { V1=$0; }
  /two/ { V2=$0; }
  V1&&V2 { nextfile; } 
  ENDFILE {
    print FILENAME,V1,V2;
    V1=V2="";
  }
' wolverin.txt wolverin_broken.txt wolverin2.txt

wolverin.txt:11 one:22 two
wolverin_broken.txt:b11 one:
wolverin2.txt:1111111 one:22222 two

Есть пара нюансов в плане граничных случаев, когда строки повторяются и т.п., но, поскольку тебе это, видимо, не важно, то я не буду это комментировать.

legolegs ★★★★★ ()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от wolverin

это все хорошо и замечательно, но зачем этот огород городить, когда мне нужно 2 конкретных значения

Затем, что у тебя «псевдо-XML» а не нормальный текст. У тебя разделитель элементов не newline а < и >. И вообще у тебя в файле вообще может быть всего одна строка, XML же, те кто его пользует любят подобные извращения.

нужно простое решение В СТРОКУ командой, которую я уже отправляю на цикл, а уже он чего надо заливает, без создания файлов из файлов и прочего бреда

Да нет тут нет никаких файлов из файлов, это прямой парсер, он просто по одному XML элементу читает, а не построчно, только и всего. Именно так и надо поступать с XML и псевдо-XML чтобы на потенциальные косяки не напороться.

Тем более, если у тебя всё это в цикл завёрнуто - уже имеет смысл скриптик сделать, а не набирать каждый раз всё в одну строку. А если скриптик - что мешает нормально распарсить XML?

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