Я думаю, что вы ищете что-то вроде
grep -vf safe_websites inputfile
-v
, чтобы инвертировать совпадения, которые вы уже знаете, и -f
, чтобы получить шаблоны из файла safe_websites
.
Попытался использовать описанный ниже метод, и он работал нормально
for i in `cat k.txt| awk -F "=" '{print $2}'| awk -F "," '{print $1}'| sed -r "s/\s+//g"| sort| uniq`; do sed -n '/'$i'/p' k.txt|sed '1s/$/\+/g'| sed "N;s/\n/W02\//g";done
выход
for i in `cat k.txt| awk -F "=" '{print $2}'| awk -F "," '{print $1}'| sed -r "s/\s+//g"| sort| uniq`; do sed -n '/'$i'/p' k.txt|sed '1s/$/\+/g'| sed "N;s/\n/W02\//g";done
REQUEST 2019-01-16 00:32:07.809@{fields}@SeqID = 9515+
REQUEST 2019-01-16 00:32:07.809@{fields}@SeqID = 9517+W02/RESPONSE 2019-01-16 00:32:07.809@{fields}@SeqID = 9517, Partner SeqID = 3393
REQUEST 2019-01-16 00:32:07.810@{fields}@SeqID = 9520+W02/RESPONSE 2019-01-16 00:32:07.810@{fields}@SeqID = 9520, Partner SeqID = 3395
praveen@praveen:~$
Я попробовал следующий код, но это занимает слишком много времени для большого файла:
awk '{
if ($0 ~ /REQUEST/ && $0 ~ /RPCLIB/)
{seqid = $0; sub(/^.*@SeqID/,"SeqID",seqid);
line_req = $0; line_resp = "";
rng_s = NR; rng_e = NR + 99999;
cmd = "awk '\''/RESPONSE.*" seqid "/ && NR >= " rng_s " && NR <= " rng_e " {print $0;exit}'\'' logfile"
cmd | getline line_resp;
close(cmd);
print line_req"+"line_resp;
}
}
' logfile
Я не могу комментировать, поэтому публикую свой комментарий как ответ, извините за это.
Вы хотите присоединиться к ЗАПРОСУ и ОТВЕТУ, если их seqid совпадают, верно? Почему бы сначала не отсортировать данные по seqid? Он будет следить за тем, чтобы ОТВЕТ всегда следовал за ЗАПРОСОМ.
Я не могу помочь вам с awk
, но я сделал этот Bash-скрипт, который делает это.
Требуется по крайней мере Bash v4 , но это должно быть довольно широко распространено..
Он ожидает ввода со стандартного ввода, а это означает, что вам нужно вызвать его, как в:
cat logfile | script.sh
или также:
script.sh < logfile
Я сделал это намеренно, думая, что это может быть желательно, но легко внедрить имя файла в сценарий, например, просто. добавив его в команду cat -n
перед |
.
Он обрабатывает:
sed
)if-elif-else-fi
)+
ХТХ
#!/bin/bash
declare -A reqs=()
{
while IFS= read -r line ; do
read -r seqid rest <<<"${line}"
line="${line#${seqid} }"
if [[ "${line}" =~ REQUEST ]] ; then
[ "${reqs[$seqid]}" ] && printf '%s+\n' "${reqs[$seqid]}"
reqs[$seqid]="${line}"
elif [[ "${line}" =~ RESPONSE ]] && [ "${reqs[$seqid]}" ] ; then
printf '%s+%s\n' "${reqs[$seqid]}" "${line}"
unset reqs[$seqid]
else
printf 'strange record at line no. %s\n' "${line}" >&2
fi
done < <(cat -n | sed -e 's/\(.*@\)SeqID *= *\([0-9]\+\)\(.*\)/\2 &/') ;
printf '%s+\n' "${reqs[@]}" ;
} | sort -k 1 | sed -e 's/\(^\|+\)[[:blank:]]\+[0-9]\+[[:blank:]]\+/\1/g'