Я полагаю, что опция --log=fd
в duplicity предназначена для сложных конвейеров, где вы хотите разделить stderr
и stdout
из вашего журнала.
Этот ответ на этот вопросдает пример. Вот простой пример:
#!/bin/sh
# Generate output on three different fds
echo hello >&3
echo world >&2
echo today >&1
И при таком выполнении
./foo 2> 2.log 3> 3.log 1> 1.log
приводит к
$ cat 1.log 2.log 3.log
today
world
hello
Сgrep+wcконвейер:
for f in *.txt; do echo -n "$f "; grep -wo 'esr' "$f" | wc -l; done
grepопции:
-w
- word-regexp (для соответствия целому/отдельному слову)
-o
- вывести только совпавшие подстроки
wc -l
- подсчитать количество строк (в нашем случае совпадающих слов) для каждого файлаfor name in file*.txt; do
printf 'Pattern occurs %d times in "%s"\n' "$(grep -wo 'pattern' "$name" | wc -l)" "$name"
done
Если вы хотите подсчитать каждое слово в любом количестве файлов, вы можете использовать AWK
, например.:
awk 'BEGIN{RS="[[:space:]]+"}
{counts[$0]++}
END{for(word in counts){print word " - " counts[word]}
' file1 file2 file...
Это обрабатывает файл так, как если бы каждое слово было на отдельной строке, этоBEGIN{RS="[[:space:]]+"}
часть , а затем подсчитывается каждый раз, когда он видит строку . Удаление части BEGIN
приведет к подсчету каждой обычной строки .
Если вас интересует только одно конкретное слово, вы можете изменить блок END
, чтобы он выглядел примерно так:
END{print counts["esr"]}
Это напечатает только время появления "esr", но помните, что это -чувствительно к регистру.
Чтобы убрать чувствительность к регистру -, используйте counts[tolower($0)]++
или counts[toupper($0)]++
.
Также можно добавить проверки для вывода данных при переходе от одного файла к другому.