Используйте grep или awk для получения второго значения строки

С GNU uniqвы можете сделать

 sort file | uniq -w 10

Опция -wограничивает сравнение 10 символами, поэтому каждая дата сохраняется только один раз. Сортировка заставляет activeпоявляться первым, поэтому он останется.

Если будущие читатели этого вопроса окажутся в системе без GNU uniq, вы можете использовать, например, sed. Классический способ удаления повторяющихся строк —

sed '$!N;/^\(.*\)\n\1$/!P;D'

Шаблон N;P;Dвсегда сохраняет две строки в пространстве шаблона, но печатает только первую, если вторая не совпадает. Мы можем изменить этот скрипт, чтобы проверять наличие дубликатов только в части даты:

sed '$!N;/^\([^ ]*\).*\n\1/!P;D'

Теперь нам нужно только позаботиться о том, чтобы предпочесть activeстроки:

sed '$!N;/^\([^ ]*\).*\n\1/!P;//s/\(.*\)\(\n\).*not.*/\2\1/;D'

Первая часть остается прежней :Печатать только строки после изменения даты (или в последней строке ). Но если дата та же (, то пустой шаблон в адресе //означает повторение последнего шаблона ), обычно вторая строка сохраняется. Но если во второй строке есть not, лучше оставить первую строку(activeили not active), поэтому команда sделает первую строку второй (после пустой строки, которая будет удалена. по Dтак или иначе ).

Я признаю, что это менее элегантно, чем версия GNU, но, по крайней мере, она остается однострочной -.

-1
20.01.2021, 19:43
3 ответа

С помощью sedвы можете попробовать это:

sed 's/^.*: "\(.*\)",$/\1/' generalInfo.info

Этот вариантcut:

cut -d'"' -f4 generalInfo.info

Сgrep:

grep -Po '(?<=": ").*(?=",)' generalInfo.info
1
18.03.2021, 22:35

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

Вот несколько вариантов для упомянутого вами простого случая:

  1. авк

     $ echo '"network": "Purple",' | awk '/network/{ gsub(/[",]/,"",$2); print $2}'
     Purple
    
  2. Группа GNU

     $ echo '"network": "Purple",' | grep -oP '"network":\s*"\K[^"]+'
     Purple
    
  3. сед

     $ echo '"network": "Purple",' | sed -n 's/"network": *"\([^"]*\).*/\1/p'
     Purple
    

    или

     $ echo '"network": "Purple",' | sed -En 's/"network":\s*"([^"]+).*/\1/p'
     Purple
    

Наконец, старайтесь избегать использования имен переменных ALLCAPS в сценариях оболочки. По соглашению, глобальные переменные среды пишутся ЗАГЛАВНЫМИ БУКВАМИ, и это может привести к путанице, если у вас также есть имена ваших собственных переменных с заглавной буквы. В конкретном случае вашего скрипта вам даже не нужна переменная. Я бы переписал ваш скрипт вот так:

#!/bin/bash

grep -q 'network.*Purple' generalInfo.info &&
    echo "This network is Purple" ||
    echo "This network is not Purple"

Вам не нужно catфайл для grepего, и вам не нужно сохранять что-то в переменной, чтобы проверить, существует ли она.

1
18.03.2021, 22:35
$ var=$(awk -F'"' '$2=="network"{print $4}' file)
$ echo "$var"
Purple
1
18.03.2021, 22:35

Теги

Похожие вопросы