Я бы сделал это, связав простые задачи:
grep 'Error Code: 704' test_log | uniq | less
Команда grep
выберет только строки, содержащие строку «Код ошибки: 704». Команда uniq
сохранит только по одному элементу каждого элемента. Знак «>» будет использовать стандартный вывод и отправлять его в файл с именем «new_file»
Возможно, есть более эффективные способы сделать это, о которых я пока не знаю
Действительно, предположение о значении параметра/переменной неустановленного в OP является неточным.
man bash
определяет переменную как особый тип параметра. Поэтому информация о переменных иногда находится в разделах, относящихся только к параметрам в целом.
Термины, описывающие характеристики и состояния относительно переменных из статьи Википедии о переменных .
unset string
:«Для каждого имени удалить соответствующую переменную…» [раздел «ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ», параграф «unset»] declare -p string
:«Опция -p будет отображать атрибуты и значения каждого имени». [Раздел ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ,«объявить»/«набрать» абзац] Вопрос должен был быть более точно сформулирован как :" Как можно отличить неинициализированную переменную bash от не -существующей? "
Ответ на это:
Не удивляйтесь тому, чтоunset
встроенная функция удаляет переменную из существования, а переменная в неустановленном состоянии в терминах bash является переменной, которая либо не была объявлена, либо была объявлена без стоимость.
Встроенная команда declare
действительно ведет себя непоследовательно в bash 4.3 по сравнению с bash 4.4 в отношении переменных, объявленных без значения:
$ # bash 4.3
$ unset string; declare string; declare -p string; echo $?
bash: declare: string: not found
1
$ # bash 4.4
$ unset string; declare string; declare -p string; echo $?
declare -- string
0
Таким образом, этот способ проверки одного используемого имени переменной не является универсальным, но работает в последних версиях bash.
К сожалению, раскрытие параметров не поможет провести различие между -несуществующими и неинициализированными переменными, так как обе ситуации охватываются одним и тем же неустановленным состоянием:
$ declare string; echo ${string-UNSET} # `string` exists, empty
UNSET
$ unset string; echo ${string-UNSET} # `string` does not exist
UNSET
К сожалению, также условный оператор -v
не помогает [руководство раздел CONDITIONAL EXPRESSIONS], он проверяет, было ли «переменной оболочки VARNAME установлено (присвоено значение )», без указания того, является ли VARNAME существовало в первую очередь:
$ unset string; ! [ -v string ] && echo "unused"
unused
$ declare string; ! [ -v string ] && echo "unused"
unused
Обсуждения, посвященные путанице в терминологии и особенностям bash в отношении состояний и значений параметров/переменных:
В версиях bash до 3.2 последовательность:
$ declare string; declare -p string
Выводит declare -- string=""
, что показывает, что переменная получает нулевую строку.
В версиях 4.1, 4.2 и 4.3 переменная ничего не устанавливает, что на самом деле вызывает ошибку:
$ declare string; declare -p string
bash: declare: string: not found
Решено на bash 4.4:
$ declare string; declare -p string
declare -- string
Это означает, что строка была объявлена, но ей не было присвоено никакого значения (, даже нулевого ).