Когда вы объявляете свой псевдоним, $4
в команде awk
находится в двойных кавычках (, поскольку вся строка псевдонима находится в двойных кавычках ). Это означает, что он будет расширен оболочкой, скорее всего, до пустой строки. Не имеет значения, что $4
находится в одинарных кавычках внутри двойных кавычек.
Вместо этого рассмотрите возможность использования функции оболочки,
badalarm () {
cat "$HOME"/sagLogs/* |
grep -I 'failed to generate expected' |
awk '{ print $4 }' | sort -u |
tee | wc -l
}
Это позволяет избежать проблем с цитированием.
Я также несколько укоротил конвейер и заменил вывод непосредственно на TTY выводом на стандартный вывод вместо (, так что оба вывода tee
и wc -l
отправляются туда ).
Ваш диапазон [\d-_]
не имеет смысла (нет диапазона, начинающегося с \d
и продолжающегося до_
). Вы имели в виду [\d_-]
?
Эквивалентом POSIX [\d_-]
является [[:digit:]_-]
или [0-9_-]
. Обратите внимание, что для включения буквального тире в выражение в квадратных скобках оно должно стоять первым или последним.
$ grep -o '[[:digit:]_-]\{1,\}' file
2021-04-21_08-45_
2021-04-21_08-15_
$ sed -n 's/.* \([[:digit:]_-]\{1,\}\).*/\1/p' file
2021-04-21_08-45_
2021-04-21_08-15_
Обратите внимание, что здесь я должен сопоставить пробел перед первой цифрой, иначе я зафиксирую только _
в конце.
Вы также можете использовать более конкретное регулярное выражение, которое на самом деле пытается сопоставить что-то в форме, которую вы ищете, а не просто любую цифру, тире или подчеркивание:
$ sed -n 's/.*\([0-9]\{4\}-[0-9][0-9]-[0-9][0-9]_[0-9][0-9]-[0-9][0-9]_\).*/\1/p' file
2021-04-21_08-45_
2021-04-21_08-15_
$ tr -d -c '\n[:digit:]_-' <file | tr -s '\n'
2021-04-21_08-45_
2021-04-21_08-15_
Здесь я использую tr
для удаления всех не -цифр, не -новой строки, не -подчеркивания и не -тире. Затем я использую его снова, чтобы сжать несколько последовательных новых строк в одиночные.