Как распечатать только номера билетов?

Как распечатать только номера билетов?

Ниже приведено содержимое файла, и мне нужно вывести только номера тикетов, заключенные в "[]". Интересно узнать, можно ли это сделать с помощью команд sed и grep.

[request://Problem/26727777] SSO Components (UAT)
[request://Problem/25709048] [SERVER-SETUP] Setup 14xMDN, 10xPRN 
[request://Problem/26716590] Logs not populated properly from all servers
[request://Problem/23995808] Prod: Create requestmary

Вывод должен быть:

26727777
25709048
26716590
23995808

Я пробовал sed -e 's/[^0-9]//g' ticket | sed '/^$/d', но не могу получить желаемый вывод. Он также включает другие числовые значения в строке, а мне нужно получить только номер тикета:

226829515211
226855182
2268555334
226819615
226781310
226853999
226828948216

решение1

Вы можете использовать GNU grep:

$ grep -oP '/\K\d+(?=])' ticket 
26727777
25709048
26716590
23995808

Или sed:

sed -E 's#.*/([0-9]*).*#\1#g' ticket
26727777
25709048
26716590
23995808

Оба вышеперечисленных варианта будут работать в приведенном вами примере, но будут ли они работать в вашем реальном файле, будет зависеть от других строк в вашем файле. Они печатают все отрезки чисел, которые находятся после a /и, для grep, которые находятся перед a ]. Если у вас есть другие строки, соответствующие этим критериям, вам нужно будет показать нам весь ваш файл.

решение2

Лично я бы использовал Perl.

perl -lne 'print /(\d+)\]/'

Должно сработать.

-lесли говорить проще, «отсортировать переводы строк» ​​— он автоматически удаляет их из строки и вставляет после каждого print.

-nговорит: «оберните это в while (<>) {цикл, который построчно перебирает STDIN (или файл), как grepэто было бы.

И -e"выражение" (или "выполнить", я полагаю) для запуска команды в кавычках. (В противном случае perlчитайте программу из STDIN)

Мы используем тот факт, что по умолчанию для регулярного выражения выполняется сопоставление с $_(в данном контексте это текущая строка).

Поскольку мы указываем группу захвата, вместо возврата «истина» или «ложь» возвращается список (состоящий из одного элемента) захваченных значений:

\d+представляет собой одну или несколько цифр. (Это «расширенное» регулярное выражение, которое примерно похоже на [0-9]+, хотя работает немного иначе, если вы используете нелатинские числа), и нам требуется ]после него.

И потому что мынеиспользуйте gв конце регулярного выражения, оно будет соответствовать только одному символу в строке.

решение3

sed 's/[^0-9]*\([0-9]*\).*/\1/'

Но если бы номер билета имел фиксированную ширину, я бы предпочел использовать cut.

Редактировать: с помощью grep: grep -o '^\[[^0-9]*[0-9]*' | grep -o '[0-9]*'

решение4

tr "\[\]/" " "| awk '/request/ {  print $3 }'

Связанный контент