LINUX.ORG.RU

grep по всем переменным, начинающимся с «ok»

 


1

1

Есть список переменных примерно таких:

ok1=1.1
ok2=2.2
.
.
ok[n]=n.n

Задача отпарсить лог файл по наличию в нём значений переменных.

cat log | grep -v "$ok1\|$ok2\|$ok3\|$ok4\|$ok5"
Так работает, но приходится каждый раз дописывать очередную переменную добавляя \|$ok[n].

Подскажите, есть ли возможность перечислить все переменные пусть даже ограничиваясь 50-ой например? Если всё-таки цикл, то как в нём перечислить переменные?

Спасибо.

Решение:

Вместо переменных сделал список whitelist и сортировка стала выглядеть так

cat log | grep -v -f whitelist
Всем спасибо, решение как всегда было на поверхности )))



Последнее исправление: Dimarius (всего исправлений: 2)

grep -v "$ok1\|$ok2\|$ok3\|$ok4\|$ok5"
Так работает

Нет, парень, ТАК не работает. Даже не очень понятно, чего ты хочешь добиться.

Deleted
()
grep "ok[0-9]\+" < log 
Deleted
()
Ответ на: комментарий от akk

Там сложная конструкция, поэтому cat.

grep -E «ok[[:digit:]]+» log
Так не получится, ok[n] это переменные, их надо с $ начинать, иначе это просто текст.

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

их надо с $ начинать

У тебя об этом ни слова не написано в ОП.

Покажи конкретно, пример текста на входе, пример на выходе.

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

В bash работает без проблем уже давно.

grep "ok[0-9]\+"

grep нужно не текстовое наименование переменной, а её значение. Без $ не получится.

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

grep нужно не текстовое наименование переменной, а её значение. Без $ не получится.

Полную чашу невозможно наполнить.
Зачем спрашивать, если ответы не нужны и пробовать предложенное не предполагалось?

Без $ не получится.

И такой раздел есть: www.linux.org.ru/forum/job/

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

В bash работает без проблем уже давно.

Ничего, что команда grep -v "$ok1\|$ok2\|$ok3\|$ok4\|$ok5" эквивалентна простому cat?

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

grep нужно не текстовое наименование переменной, а её значение

grep -f в помощь
grep -f <(cat list|cut -d= -f2-) log

Насчет -v не уверен, значения нужно выбросить из вывода? Тогда и выше добавить -v.

Если в list просто значения без ok=, то
grep -f list log
grep -vf list log

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

Нет, парень, ТАК не работает. Даже не очень понятно, чего ты хочешь добиться.

Нет, понятно кажется. Но с трудом. У него в топике два куска одного и того же скрипта похоже. Грепается, соответственно, «1.1|2.1» и т.д. :-)

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

Если переменные нужны были только для их подстановки в grep, то они были не нужны:

grep -vFf <( echo "1.1
2.2
3.3
4.4" ) log
что тут же сдувается до
grep -vFf '1.1\|1.2\|1.3' log
:)

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

Предложенное предполагалось опробовать, опробовано и не работает.

Dimarius
() автор топика
cat 1.log 
sfsdlf jsf sfd sdf ok1=1.1 sdf sjlf
sd sdf sf df ok2=2.2 df s

egrep -o 'ok[0-9]+=[^ ]+' 1.log  | cut -d= -f2
1.1
2.2

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

когда в дефолтную поставку слаки завезут нормальные видеоплееры?

У одного один нормальный, у другого — другой, у третьего — третий... На всех не угодишь ;-)

Я не Патрик, но можно попробовать предложить свой нормальный видеоплеер для включения в будущую 15.0 там:
https://www.linuxquestions.org/questions/slackware-14/requests-for-current-14...

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

Если переменные нужны были только для их подстановки в grep, то они были не нужны:

Если скрипт более сложен, и значения откуда-то ещё берутся, то нужны. Dimarius, ну собери циклом значения всех переменных в одну и подставь её в grep.

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

В смысле у одного один, у другого другой? Есть все два нормальных плеера в линуксах - мпв и влц. Второй комбайн, но есть полезные upnp и изкоробочные стримы. Первый минималистичный и удобный во всех других отношениях. Сборка не сильно сложнее дефолтных плееров в составе слаки, но, блин, 20 лет прошло, а их все не включат. Самое интересное, что никто из пользователей слаки и не чешется по этому поводу, хотя я сомневаюсь, что те, кто сидели до слаки в других дистрах, пользовались всякими dragonplayer`ами, mplayer`aми и прочей фигней.

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

Есть все два нормальных плеера в линуксах - мпв и влц.

мпв настолько «нормальный», что мне приходилось откатываться на mplayer, чтобы смотреть киношки с сабами.

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

Вшитые сабы работают изкоробки. Внешние сабы подключаются из командной строки без проблем. Какие проблемы?

anonymous
()

Если просто склеить, то что-то вроде

a=`for i in \`seq 2 50\`; do echo -n \|\$ok$i; done`
cat log | grep -v "$ok1|$a"

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

Что же ты такое делаешь с сабами, грязный извращнец?

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

Если что, кодировочные проблемы в mpv это кодировочные проблемы системы. Если у не совпадают кодировки сабов и общесистемные, при чем тут mpv? И вообще, с 2014 в mpv встроен автодетект, если скомпилино с libenca. Плюс, даже если у тебя такой случай, что сабы не в той кодировке и мпв их не распознает, тебе что 10 слов в теминале лень написать, чтобы все сабы конвернуть в нужную?

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

Даю ещё одну наводку - man grep. Тебе должно понравиться.

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

Только значения переменных не берёт:

echo $a
|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50

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

Еще обращаю внимание на -F или на \. — иначе точке соответствует любой символ, шаблон 1.1 соответствует всем: 1.1, 111, 121, 1?1, ...

bormant ★★★★★
()

Ну и цирк. Половина не поняли задачу вообще, а нормальных башистов и вообще не появлялось.

ok1=1
ok2=42
.....

for n in ${!ok@}; do
        v+=${v:+|}${!n}
done
grep -v "$v" log

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

Прошу прощения:

a=`for i in \`seq 2 50\`; do echo -n \|\\$ok$i; done`
cat log | eval grep -v "\"\$ok1|$a\""

А лучше вот это решение: grep по всем переменным, начинающимся с «ok» (комментарий)

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)

cat log | grep - без кота - жизнь не та, это да….

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

Боже мой. Я, конечно, тоже начинал тогда, когда не было $(), а был только `, да и bash-ем не пахло вообще. Но сейчас то где эти shell без $(), который в вашем коде просто наинагляднейше необходим.

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

+1 красивый цикл, то что и надо было, класс! Спасибо огромное!

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

Плюс, даже если у тебя такой случай, что сабы не в той кодировке и мпв их не распознает, тебе что 10 слов в теминале лень написать, чтобы все сабы конвернуть в нужную?

Ппц поколение виндовс. Может мне еще код вручную в машкоды покомпилировать вместо компилятора? Рутинную работу должна делать машина.

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

Можете посоветовать литературу (ресурс), где можно почитать по конструкции как в вашем скрипте? ${!ok@} v+=${v:+|}${!n} как их строить, зависимости, последовательности и т.п.?

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

Ну и цирк. Половина не поняли задачу вообще

Перечитал на 5-й раз. Только глядя на твой код понял, что хотел ТС.

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

Можете посоветовать литературу (ресурс), где можно почитать по конструкции как в вашем скрипте?

man bash

Это не больно.

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

Мальчик, поколоние виндоус тут только ты. Я на бсд и линуксах сижу с 2001 года, когда ты только родился.

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

Угадал. Еще ретроград и враг прогресса. Не видно что ли?

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

Можете посоветовать литературу (ресурс), где можно почитать по конструкции как в вашем скрипте?

Литература, конечно, большинство конструкций описывает, но стандартная беда её в том, что рассматривает простейшие примеры, даже там, где гордо себя именует «advanced guide». По мне, надо применять хороший инженерный подход к знанию инструментов: знать что умеет и удобен ли для данной задачи этот инструмент, помнить, какие фичи оно умеет и уметь быстро находить их в справочнике. Помнить какие закорючки/ключи у утилит не надо, но то что это есть - сильно помогает. Это большой опыт и приходит со временем.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.