С 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, но, по крайней мере, она остается однострочной -.
С помощью sed
вы можете попробовать это:
sed 's/^.*: "\(.*\)",$/\1/' generalInfo.info
Этот вариантcut
:
cut -d'"' -f4 generalInfo.info
Сgrep
:
grep -Po '(?<=": ").*(?=",)' generalInfo.info
Есть много способов сделать это. Однако, как уже упоминалось в комментариях, если это на самом деле структурированные данные JSON, вы можете изучить такие вещи, как jq
, предназначенные для анализа JSON.
Вот несколько вариантов для упомянутого вами простого случая:
авк
$ echo '"network": "Purple",' | awk '/network/{ gsub(/[",]/,"",$2); print $2}'
Purple
Группа GNU
$ echo '"network": "Purple",' | grep -oP '"network":\s*"\K[^"]+'
Purple
сед
$ 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
его, и вам не нужно сохранять что-то в переменной, чтобы проверить, существует ли она.
$ var=$(awk -F'"' '$2=="network"{print $4}' file)
$ echo "$var"
Purple