LINUX.ORG.RU

Подскажите как вычленить с помощью grep

 ,


1

2

Доброго времени суток. Не могу разобраться в синтаксисе так как на русском не нашёл нормального мануала. Имеется файл с текстом в виде:

{
"attr1": 9999.34
"attr2": 8888.23
"attr_3": 3334.00,
"attr4": value
}

Как получить значения первых двух атрибутов в чистом виде и в одну строку? Хочу что бы было вот так:

~$cat file | grep -magic
9999.34 8888.23
~$

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

Разъясните подробнее. Файл редактировать нельзя. Задача использовать именно grep. Можно и в две строки. На сколько я понимаю нужны два ключа -o и -e но какие параметры вписывать вобще непонятно.

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

Вам бы только потроллить. Я задаю вполне вменяемые вопросы. С какой целью вы тратите здесь время если вам не это не интересно?

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

Ну извини, что не сразу распознал, что ты делаешь домашнее задание, а не решаешь реальную проблему. Если бы знал и писать бы не стал.

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

Для примера. Потому что не важно откуда пришли данные из файла или из вывода другой команды. Если вы бог оболочки, не думайте что все вокруг тоже должны всё знать и писать правильно код. Если бы я знал как это сделать правильно, не обратился бы за помощью.

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

повторю вопрос, cat тут зачем?

Это соответствует духу UNIX.

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

а у тебя зачем тут cat, в чём сакральная разница между

cat file | grep -E '"attr1"|"attr2"' | grep -o ':.*' | grep -Eo '[0-9.]+'

и

grep -E '"attr1"|"attr2"' file | grep -o ':.*' | grep -Eo '[0-9.]+'
novitchok ★★★★★
()
Ответ на: комментарий от novitchok

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

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

Да ну чего с этим cat'ом пристал то? Мне так больше нравится. Так UNIXвейней. В идеальном UNIX мире grep'у не нужно знать об этих твоих файлах. Устроит такой ответ?

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

Вон tr не умеет в файлы и прекрасно себе живет. Пойду зашлю Столлману патч с удалением поддержки файлов из grep.

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

это только в твоём мире

grep'у не нужно знать об этих твоих файлах

у остальных тащемта

grep  searches  for  PATTERN in each FILE
что мы и имеем в ОП.

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

но источник может быть как из файла так и из программы

плохо таким быть, очень плохо, открой

man grep
и прочитай секцию DESCRIPTION, потом попытайся подумать.

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

попытайся подумать.

Нехуя думать, спрашивать надо!

anonymous
()

grep по этим двум, cut по : второе поле, xargs echo. Или даже без grep, если структура неизменная, то head.

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

Ты еще слишком юн, чтобы просветиться. Почитай man tr, вот где истинный UNIX живет. Почитай родословную true, вот где истинный UNIX убили.

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

Или если гнутый сед из последних, то

grep -E -m2 -o [0-9]+\.[0-9]+ file | sed -z 's/\n/ /'
sevlast
()

Нафик тебе греп? AWK одной строчкой решит вашу проблему.

Bootmen ☆☆☆
()

Доброго времени суток.

Просто забудь такую форму приветствия и никогда её больше не употребляй.

Бойся своих желаний, ну, или научись формулировать мысли более чётко.

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

$ cat 1.txt | awk 'NR == 2 {x = $2} NR == 3 {x = x" "$2} END {print x}'
9999.34 8888.23
То, что ты подразумевал, будет выглядеть так
$ cat 1.txt | awk '/attr1/ {x1 = $2} /attr2/ {x2 = $2} END {print x1" "x2}'
9999.34 8888.23
Никаких проверок на валидность входящих данных тут не производится, ведь тебе они и не нужны.

Относительно спора откуда получать данные. Это выглядит примерно так.

  • Давайте соорудим трёхколёсный велосипед, чтобы проехать 10 метров.
  • Ок. Соорудили.
  • Ой, я забыл упомянуть, что на следующей неделе, надо на этом велосипеде слетать на луну и вернуться группой в 120 морских пехотинцев, чтобы там немножко и победоносно повоевать с китайцами за гегемонию, территорию и рисовые оладушки.
justAmoment ★★★★★
()
Ответ на: комментарий от sevlast

Спасибо. Это прям здорово. Откуда же вы такие берётесь

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

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

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

Ну, либо добавь перевод строки

$ cat 1.txt | awk '/attr1/ {x1 = $2} /attr2/ {x2 = $2} END {print x1"\n"x2"\n\n"x1"\n\n\n"x2"\n\n\n\n"x1"\n\n\n\n\n"x2}'
9999.34
8888.23

9999.34


8888.23



9999.34




8888.23
Либо просто печатай второе поле в найденных строках по порядку их появления
$ cat 1.txt | awk '/attr[12]/ {print $2}'
9999.34
8888.23

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

Спасибо это уже круто и самое главное коротко! Но как указать два разных имя атрибута если один attr а второй abcd?

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

И если не затруднит, укажите пожалуйста как получить тот же результат только исключить ковычки?

~$cat file
{
   "some": -2'
   "attr": "ineedthiswithoutsht"
}
~$sh command
ineedthiswithoutsht
~$

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

Но как указать два разных имя атрибута если один attr а второй abcd?

Ну ты житрован. А man awk прочитать слабо?

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

у меня гугл не открывает. а что там? на русском языке? если бы там хоть что-то понятно объясняли я бы не лез на лор

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

спасибо, методом тыка разобрался с первым:

cat 1.txt | awk '/attr/, /abcd/ {print $2}'
подскажи лучше как ковычки убить

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

Затем, что ТС хотел вывод в одну строку.

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

При наличии такого исходника

cat 1.txt
{
"attr1": 9999.34
"attr2": 8888.23
"attr_3": 3334.00,
"attr4": value
"abcd": "kokoko"
}

Результат делается так (один из кучи возможных вариантов)

$ cat 1.txt | awk '/abcd|attr_3/ {sub(/^"/, "", $2); sub(/"$/, "", $2); print $2}'
3334.00,
kokoko

То что ты написал — это вообще про другое. Просто поменяй местами abcd и attr в своём варианте и сам убедись.

У меня вопрос по существу: ты хоть какой-нибудь язык программирования знаешь или awk — это твой первый язык, который ты пытаешься использовать?

Примеры по awk есть в интернете. Например здесь http://rus-linux.net/MyLDP/consol/awk.html

В нормальной жизни идея отрезать кавычки у данных (то что стоит во втором столбце) — это путь в могилу. Это примерно как насрать себе в карман (нагрудный), а потом ходить с высоко поднятой головой и гордо себя стучать по груди, крича, что какой ты молодец, что один так умеешь. А остальные встречные люди будут перебегать от тебя на другую сторону улицы, лишь бы их не забрызгало такими брызгами счастья.

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

Пойду зашлю Столлману патч с удалением поддержки файлов из grep.

Это было бы не плохо, может если утилита от этого станет более логичной то получится ещё какой полезный функционал добавить.

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

cat file | grep

cat тут зачем?

На ЛОРе я так всегда пишу, нравится видеть фейерверки таких как ты.

futurama ★★★★★
()

Надо отгрепать attr1, att2, а потом удалить каждый второй \n начиная с первого. Например, заменяешь \n на X, получается

"attr1": 9999.34X"attr2": 8888.23X"attr1": ...
X"attr1" заменяешь на \n, X"attr2" и первый «attr1» вырезаешь.

anonymous
()
Ответ на: комментарий от justAmoment
tr -d "\"" 

tr сработал но всё равно спасибо.

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

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

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

Я вот админ. шелл тикл перл научился. Админу более не надо. Зачем заморачиватся. Кстати и в железе глубоко. Пускай железняки бздят. :) Нельзя все обьять. Обрабатывайте глюки по времени поступления.

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