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 ()
Ответ на: комментарий от novitchok

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

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

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

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

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

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

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

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

$ 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 ★★★★★ ()
Ответ на: комментарий от 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 ★★★★★ ()
Ответ на: комментарий от 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 ★★★★★ ()

Надо отгрепать 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 ★☆☆ ()