Как добавить несколько строк в файл, если этих строк нет в этом файле?

Демон действительно запущен. Вам нужно будет использовать sudo , чтобы получить достаточно привилегий для связи с ним:

sudo tgtadm --lld iscsi --op show --mode target
2
17.01.2018, 16:04
2 ответа

Простой сценарий оболочки для добавления строк из файла newdataв datafile. Должно быть просто изменить newdataна здесь -doc. На самом деле это не очень эффективно, так как вызывает grepдля каждой (новой )строки ввода:

target=datafile
while IFS= read -r line ; do
    if ! grep -Fqxe "$line" "$target" ; then
        printf "%s\n" "$line" >> "$target"
    fi
done < newdata 

Для каждой строки мы используем grep, чтобы узнать, существует ли она уже в целевом файле, -Fдля фиксированного, -совпадения строки, (без регулярных выражений, ), -xдля полного совпадения строки, и -qдля подавления вывода совпадающих строк. grepвозвращает ложный код ошибки, если не находит совпадающую строку, поэтому добавляет к целевому файлу, если отрицательный результат верен.


Более эффективно, в awk. Это зависит от того, что awkможет обрабатывать произвольные строки как ключи к массиву.

$ awk 'FNR == NR { lines[$0] = 1; next } ! ($0 in lines) {print}' datafile newdata 

Первая часть FNR == NR { lines[$0] = 1; next }загружает все строки первого входного файла в качестве ключей в (ассоциативный )массив lines. Вторая часть ! ($0 in lines) {print}работает со следующими входными строками и печатает строку, если ее нет в массиве, то есть «новые» строки.

Результирующий вывод содержит только новые строки, поэтому его необходимо добавить к исходному файлу, например. сsponge:

$ awk 'FNR == NR { lines[$0] = 1; next } ! ($0 in lines) {print}' datafile newdata | sponge -a datafile

Или мы могли бы awkдобавить строки к последней строке, для этого просто нужно передать имя файла вawk:

$ target=datafile 
$ awk -vtarget="$target" 'FNR == NR { lines[$0] = 1; next } 
                        ! ($0 in lines) {print >> target}' "$target" newdata

Чтобы использовать здесь -документ с awk, нам нужно добавить-(stdin )в качестве явного исходного файла, в дополнение к настройке перенаправления,такawk... "$target" - <<EOF

3
27.01.2020, 21:52
filename='openFileLimit.txt'
while read p; do
    if grep "$p" /target/file/and/path; then
            echo "$p already present"
    else
            echo "$p" >> /target/file/and/path
    fi
done < $filename
0
01.10.2020, 08:01

Теги

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