Совпадение диапазона цифр и других символов с sed

Когда вы объявляете свой псевдоним, $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отправляются туда ).

0
21.04.2021, 09:55
1 ответ

Ваш диапазон [\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для удаления всех не -цифр, не -новой строки, не -подчеркивания и не -тире. Затем я использую его снова, чтобы сжать несколько последовательных новых строк в одиночные.

1
28.04.2021, 22:51

Теги

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