Удалить разрывы строк с помощью команды linux - PullRequest
1 голос
/ 27 марта 2020

Мой файл журнала базы данных выглядит следующим образом ...

vi test.txt

'2020-03-27T08:00:24Z UTC [ db=xdb user=root pid=9037 userid=100 xid=36076898 ]' LOG: SELECT nspname FROM pg_namespace ORDER BY nspname
'2020-03-27T08:00:24Z UTC [ db=xdb user=root pid=9037 userid=100 xid=36076899 ]' LOG: SET search_path TO "public"
'2020-03-27T08:00:24Z UTC [ db=xdb user=root pid=9037 userid=100 xid=36076900 ]' LOG: SELECT typname
FROM pg_type
WHERE typnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema())
'2020-03-27T08:00:24Z UTC [ db=xdb user=root pid=9037 userid=100 xid=36076897 ]' LOG: SELECT datname FROM pg_database ORDER BY datname

Из-за разрывов строк типа '\ n' и '\ r' я не могу проверить полный запрос. Например,

# grep '2020' test.txt
'2020-03-27T08:00:24Z UTC [ db=xdb user=root pid=9037 userid=100 xid=36076898 ]' LOG: SELECT nspname FROM pg_namespace ORDER BY nspname
'2020-03-27T08:00:24Z UTC [ db=xdb user=root pid=9037 userid=100 xid=36076899 ]' LOG: SET search_path TO "public"
'2020-03-27T08:00:24Z UTC [ db=xdb user=root pid=9037 userid=100 xid=36076900 ]' LOG: SELECT typname
'2020-03-27T08:00:24Z UTC [ db=xdb user=root pid=9037 userid=100 xid=36076897 ]' LOG: SELECT datname FROM pg_database ORDER BY datname

Как видите, строка " FROM pg_type " отсутствует в приведенном выше выводе. Как удалить разрывы строк в этом текстовом файле? Мне нужно будет оставить разрыв строки до '2020', так как это другой запрос.

Как написать регулярное выражение, которое удалит все разрывы между "LOG:" и "2020 -"

Ответы [ 4 ]

1 голос
/ 27 марта 2020
$ awk '{printf "%s%s", (/^\047/ ? ors : ofs), $0; ors=ORS; ofs=OFS} END{printf "%s", ors}' file
'2020-03-27T08:00:24Z UTC [ db=xdb user=root pid=9037 userid=100 xid=36076898 ]' LOG: SELECT nspname FROM pg_namespace ORDER BY nspname
'2020-03-27T08:00:24Z UTC [ db=xdb user=root pid=9037 userid=100 xid=36076899 ]' LOG: SET search_path TO "public"
'2020-03-27T08:00:24Z UTC [ db=xdb user=root pid=9037 userid=100 xid=36076900 ]' LOG: SELECT typname FROM pg_type WHERE typnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema())
'2020-03-27T08:00:24Z UTC [ db=xdb user=root pid=9037 userid=100 xid=36076897 ]' LOG: SELECT datname FROM pg_database ORDER BY datname
1 голос
/ 27 марта 2020
awk 'match($0, r) && NR>1 {print ""} 
    {printf "%s", $0} END {print ""}
    ' r="^'2020" test.txt
1 голос
/ 27 марта 2020

Это может работать для вас (GNU sed):

sed '/^'\''2020/{:a;N;/^\('\''2020\).*\n\1/!s/\n/ /;ta;P;D}' file

Если строка начинается '2020, добавьте следующую строку, а если эта строка не начинается '2020, замените новую строку между строки с пробелом, добавьте следующую строку и повторите. В противном случае напечатайте / удалите первую строку и повторите.

ОП выразил How do I write a regular expression that will remove all breaks between "LOG:" and "'2020-". Для обработки любого года используйте:

sed '/^'\''[1-9][0-9][0-9][0-9]/{:a;N;/^'\''[1-9][0-9][0-9][0-9].*\n'\''[1-9][0-9][0-9][0-9]/!s/\n/ /;ta;P;D}' file
1 голос
/ 27 марта 2020

Немного грязное решение, но вы можете сделать что-то вроде:

cat my_log_file.log | tr '\n' ' ' | sed "s/\('[0-9]\{4\}\)/\r\n\1/g"

# OR, simpler version:

tr '\n' ' ' < my_log_file.log | sed "s/\('[0-9]\{4\}\)/\r\n\1/g"

в основном, вы удаляете все '\ n', а затем добавляете их снова, где они должны быть

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...