Возможно, ваш сценарий производит вывод в stdout
и stderr
, и вы получаете только один из этих потоков, выводимых в ваш файл журнала.
./ my_script.sh | tee log.txt
действительно выводит все на терминал, но выводит только stdout
в файл журнала.
./ my_script.sh> log.txt 2> & 1
будет делать наоборот, сбрасывая все в файл журнала, но ничего не отображая на экране.
Хитрость заключается в том, чтобы объединить два с tee
:
./myscript.sh 2>&1 | tee log.txt
Это перенаправляет stderr
( 2
) в stdout
( 1
), затем направляет stdout
в tee
, который копирует его на терминал и в файл журнала.
Эквивалент zsh
multios будет выглядеть так:
./myscript.sh >&1 > log.txt 2>&1
То есть перенаправить stdout как на исходный stdout, так и на log.txt (внутренне через канал на что-то, что работает как tee
] ), а затем перенаправить stderr на него (на конвейер к внутреннему tee
-подобному процессу).
Используйте printf
для вывода списка файлов внутри каждого каталога и awk
для уникальной идентификации идентификаторов пользователя -
shopt -s nullglob
printf '%s\n' *.txt | awk -F_ '!unique[$1]++ { print $1 }'
и чтобы напечатать только количество, выполните
printf '%s\n' *.txt | awk -F_ '!unique[$1]++ { count++ } END { print count }'
Сzsh
:
$ typeset -A count
$ for f (<->_*.txt(N)) ((count[${f%%_*}]++))
$ echo $#count users
3 users
$ printf '%s: %s\n' ${(kv)count}
74687: 4
75308: 4
75282: 2
Просто передайте результат в grep
, а затемsort
:
ls -1 | grep -oP "^\d+" | sort | uniq -c
Теперь у вас есть отсортированные данные с идентификаторами USER ID и их количеством.