Вы можете обойтись просто awk:
awk -v ip=127.0.0.1 'substr($0, ip) > 0 {print FILENAME ": " $0} FNR > 500 {nextfile}' *.log
Если IP был найден в текущей строке, мы печатаем его и имя файла. Мы переходим к следующему файлу, если текущий номер строки для текущего файла(FNR
)стал > 500.
"$@"
расширяется до списка строк в кавычках. Если вы передадите два аргумента logread
и -f
в свою функцию, то "$@"
расширится до двух строк.
Таким образом, выполнение grep -- "$@"
расширится до grep -- logread -f
, что означает «grep для logread
в файле с именем -f
».
Если вы хотите передать отдельные аргументы, а не одну строку, используйте "$*"
, чтобы преобразовать аргументы в одну строку в кавычках.
grep -e "$*"
расширится до grep -e "logread -f"
. Позиционные параметры будут разделены первым символом в $IFS
при использовании"$*"
(по умолчанию, это пробел ). Также обратите внимание, что использование $*
или$@
без кавычек не имеет смысла.
Кроме того, я бы предпочел использовать pgrep
/ pkill
здесь:
if ! pgrep -xf "$*" >/dev/null; then
printf 'No process matches "%s" exactly\n' "$*"
fi