grep -A 5 FAILED log.txt | \ # Get FAILED and dst and other lines
egrep '(FAILED|dst=)' | \ # Just the FAILED/dst lines
egrep -o "err:[0-9]*|dst=[0-9]*" | \ # Just the err: and dst= phrases
cut -d':' -f 2 | \ # Strip "err:" from err: lines
cut -d '=' -f 2 | \ # Strip "dst=" from dst= lines
xargs -n 2 # Combine pairs of numbers
023 447872123456
024 447872987654
Как и для всех оболочек «один», почти наверняка есть более элегантный способ сделать это. Тем не менее, я нахожу итеративный подход очень успешным для получения того, что я хочу: начните с слишком большого количества информации (ваш grep), затем сузьте строки, которые я хочу (с помощью grep), затем вырежьте части каждой строки, которую я хочу ( вырезать).
Хотя использование набора инструментов linux занимает больше строк, вам нужно знать только основы нескольких команд, чтобы делать практически все, что вы хотите. Альтернативой является использование awk, python или других языков сценариев, которые требуют более специализированных знаний программирования, но занимают меньше места на экране.