У меня нет большого опыта работы с awk, но я подумал, что стоит попробовать. Я полагаю, что это довольно хрупко, поскольку я не знаю, сколько строк журнала вы пытаетесь получить с помощью этого.
Как бы то ни было, здесь используется блок BEGIN
для настройки выбираемых переменных и строка формата для печати перед отображением заголовка. Время и EmailTo предсказуемы, поэтому можно использовать пронумерованные поля ( $ 1
, $ 2
и $ 5
) перед тремя наборами регулярных выражений, которые являются очень приблизительными. . Будем признательны за любые предложения по улучшению!
awk 'BEGIN {
from=""; ip=""; error=""; fstr="%-24s%-24s%-40s%-16s%s\n";
printf(fstr, "Timestamp:", "EmailTo:", "EmailFrom:", "IPAddress:", "ErrorCodes:");
}
{ for (i=6; i<NF; i++)
{
# From Address
if ($i ~ /FROM:<[^ ]*>/)
from=substr($i, 7, length($i)-7);
# Errors found in two adjacent fields.
if ($(i-1) ~ /[[:digit:]]{3}/ && $i ~ /[[:digit:]]\.[[:digit:]]\.[[:digit:]]/)
error=$(i-1) " " $i;
# From address after predictable string.
if ($(i-2) " " $(i-1) == "Messages from" && $i ~ /[[:digit:].]{7,15}/)
ip=$i;
}
printf(fstr, $1" "$2, $5, from, ip, error);
}' logs
То, что вам нужно, называется функцией :
#!/bin/bash
max() {
if [ "$1" -gt "$2" ] ;
then
printf %s\\n "$1"
else
printf %s\\n "$2"
fi
}
max 4 6
max -2 -5
max 7 -3
Дополнительная литература:
Вы можете сделайте то, о чем вы просите, вот так:
#!/bin/bash
mkdir -p temp
cd temp
cat <<\_script_lines_ > max.sh
#!/bin/bash
if [ "$1" -gt "$2" ] ;
then
printf '%s\n' "$1"
else
printf '%s\n' "$2"
fi
_script_lines_
chmod u+x max.sh ### make the script excutable.
# Use the script:
./max.sh 4 6
./max.sh -2 -5
./max.sh 7 -3
Но функция, уже рекомендованная Wildcard, кажется более разумной для использования.
Если вы чувствуете себя готовым к программированию, вы можете получить скрипт для открытия второго или даже третьего окна консоли и использовать их для ввода/вывода, как чтение, запись из других файлов, но используя консоли вместо этого.
Я не знаю, каков синтаксис bash, вам нужно погуглить или спросить на stackoverflow.