Добавить количество совпадений grep в той же строке, что и имя файла

Вам нужно сделать это

for i in {1..6}; do
    ip_var="IP_$i"
    id_var="ID_$i"
    wget... "http://${!ip_var}/..." -O "/home/administrator/Logs/${!id_var}/..."
done

Здесь используется «переменная косвенность», как описано в руководстве:https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion

Однако пронумерованные переменные неуклюжи. Вместо этого используйте массивы:

ip=( "xx.xx.xx.xx" "xx.xx.xx.xx"... "xx.xx.xx.xx" )
id=( "yyyyy" "yyyyy"... "yyyyy" )

for ((i=0; i < ${#ip[@]}; i++)); do
    wget... "http://${ip[i]}/..." -O "/home/administrator/Logs/${id[i]}/..."
done

-1
21.09.2020, 17:15
1 ответ

С помощью >> fileфайл открывается на стандартном выходе в режиме добавления. Таким образом, любой вывод идет в конец файла.

grepпишет 12\n. Ваш файл заранее содержал foo\n. Таким образом, вы получаете foo\n12\n. Чтобы получить foo12\n, вам нужно вывести не в конце, а в последнем байте перед концом, чтобы перезаписать \nна 12\n.

В некоторых оболочках для этого есть операторы.

Сzsh:

zmodload zsh/system
if sysseek -u 1 -w end -1; then
  grep -c WORD /home/user/data
else
  syserror -p "Can't seek to just before the end: "
fi 1<> file

Сksh93:

grep -c WORD /home/user/data 1<> file >#((EOF - 1))

<>— оператор перенаправления, открывающий файлы в режиме чтения+записи. Здесь нам не нужна часть read , но мы используем <>, поскольку в отличие от >она не усекает файлы.

В любом случае, это не режим добавления . Вы увидите разницу, если какой-то другой процесс также записывает в файл или усекает его одновременно (вряд ли это будет проблемой в вашем случае ).

Другой подход может состоять в том, чтобы обрезать файл, чтобы удалить конечный \n, а затем открыть файл в режиме добавления .

С GNUtruncate:

truncate -s -1 file && grep -c WORD /home/user/data >> file
1
18.03.2021, 23:04

Теги

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