Присвоить переменной вывод команды printf
Есть текстовый файл list.txt, в котором каждая строка (а их более 200) содержит информацию по дате типа: "04/08/1995 - какой-то текст ...". Год может быть разный, а день и месяц - повторяться, т.е. несколько строк с одной датой 04/08/. Нужно прочитать файл построчно с выбором строк с одинаковой датой день/месяц (год не важен) относительно сегодня: date +'%d/%m'. Решение нашёл такое:
#!/bin/bash
while IFS= read -r line; do
if [[ "$line" != "" ]]; then
printf '%s\n' "$line" | grep "^$(date +'%d/%m')"
fi
done < list.txt
Но в данном решении вывод идёт в терминал командой printf, а нужно получать выбранные строки в переменную.
Пробовал printf присвоить переменной:
result=$(printf '%s\n' "$line" | grep "^$(date +'%d/%m')")
на выходе не совсем тот результат (проверял выводом переменной в терминал с помощью echo и printf
Ожидаемый результат (пример):
04/08/1888 - какой-то текст
04/08/1999 - ещё текст
С printf "$result" вывод:
1999 - тексттекст
С printf -v $result вывод:
04/08/188804/08/1999printf: usage: printf [-v var] format [arguments]
printf: usage: printf [-v var] format [arguments]
строки с printf: usage: printf [-v var] format [arguments] по количеству строк в файле list.txt
С echo "$result" вывод:
04/08/1888 - какой-то текст
04/08/1999 - ещё текст
но выводятся пустые строки согласно количества строк в файле list.txt.
Ответы (2 шт):
можно просто сделать проще:
result=$(awk -v d=$(date +'%d/%m') -F'/' '$1"/"$2 == d' list.txt)
простой пример:
$ cat list.txt
05/08/1888 - какой-то текст 1
05/08/1999 - какой-то текст 2
03/08/1999 - какой-то текст 3
05/02/1299 - какой-то текст 4
$ date +'%d/%m'
05/08
$ result=$(awk -v d=$(date +'%d/%m') -F'/' '$1"/"$2 == d' list.txt)
echo "$result"
05/08/1888 - какой-то текст 1
05/08/1999 - какой-то текст 2
Вопрос до конца не понятен, но все же постараюсь ответить:
#!/bin/bash
while IFS= read -r line; do
#_____^^^^^___для чего используется сброс разделителя полей
if [[ "$line" != "" ]]; then
#_______________^^^______лучше использовать стандартные ключи if
#[[ -z $line ]] && переменная пустая
#[[ -n $line ]] && переменная не пустая
printf '%s\n' "$line" | grep "^$(date +'%d/%m')"
#___^^^^^^^^^^^^^^^^^^^^^^^___ данную часть можно обойти
# например использовав стандартную возможность шелл работу с перменными
#grep "^$(date +'%d/%m')" <<< "$line"
#Но в данном случае у вас нет проверки выбралась ли строка или нет
fi
done < list.txt
Конструкция как и printf на мой взгляд избыточны, оставил комментарии в коде выше
#Вариант 1 - создавать массив неопределенной длинны
while read -r line; do
array+=( "$line" )
#посмотреть длину массива ${#array[@]}
#развернуть весь массив ${array[@]}
#получить первое значение ${array[0]}
done< <(grep "^$(date +'%d/%m')" list.txt)
#Вариант 2, просто записать вывод команды в переменную
var=`grep "^$(date +'%d/%m')" list.txt`
По поводу команды:
result=$(printf '%s\n' "$line" | grep "^$(date +'%d/%m')")
#_____^___каждую итерацию цикла переменная будет перезаписываться и будет
#содержать только последние значение, для записи значения в конец переменной
#лучше использовать +=
В данном случае в команде уже предусмотрен переход на новую строку '%s\n', но grep не выбирает новую строку, что бы переменная имела вид данные\nданные\n, попробуйте уже как стринг добавить перевод строки:
result+=`printf '%s\n' "$line" | grep "^$(date +'%d/%m')"`\\n
result+=`printf '%s\\n' "$line" | grep "^$(date +'%d/%m')"`
___________________^_____экранирование
#printf $result
#echo -e $result
Если я не правильно понял проблему, то готов ответить на вопросы и отредактировать данное сообщение.