Я хочу извлечь определенные поля из системных журналов с помощью grep или awk

В Linux вы можете запросить виртуальное адресное пространство некоторого процесса, используя proc (5)и pmap (1).

Итак, для процесса 1234 запустите cat /proc/1234/maps, pmap 1234,cat /proc/1234/numa_maps

См. также numa (7 ), numa _карты (5 ), set _mempolicy (2 ), numactl (8).

1
18.09.2020, 15:20
2 ответа

Что-то подобное с sedможет помочь:

$ sed "s/^.*version_apk': '\([^']*\).*account_id': \([^,]*\).*$/\1 \2/" syslog
2.3.7 2417963

Для каждой строки это

  • начинается в начале строки(^)
  • соответствует 0 или более любых символов (.*), пока не дойдет доversion_apk: '
  • определяет группу(\(...\)). Эта группа соответствует 0 или более символам, которые не являются одинарной кавычкой (— одиночной кавычкой, которая заканчивала бы значение версии _apk;[^']*).
  • снова соответствует 0 или более любых символов (.*), пока не дойдет доaccount_id:
  • определяет другую группу. Эта группа соответствует 0 или более символам, которые не являются запятой (запятая после account_id;[^,]*)
  • соответствует 0 или более символов до конца строки(.*$)
  • Заменяет все совпадение содержимым первой группы, пробелом и содержимым второй группы(\1 \2)

Предполагается, что version_apkвсегда предшествует account_id.

1
18.03.2021, 23:04

С GNU awk для 3-го аргумента для match()иgensub():

$ cat tst.awk
/'login_context'/ && /'platform': 'mobile_native_apk'/ && /R./ && /result/ {
    delete f
    while ( match($0,/'([^']+)': ('[^']+'|[0-9]+)/,a) ) {
        f[a[1]] = gensub(/'/,"","g",a[2])
        $0 = substr($0,RSTART+RLENGTH)
    }
    print f["version_apk"], f["account_id"]
}

$ awk -f tst.awk file
2.3.7 2417963
0
18.03.2021, 23:04

Теги

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