
Ниже приведено содержимое файла, и мне нужно вывести только номера тикетов, заключенные в "[]". Интересно узнать, можно ли это сделать с помощью команд 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 }'