想象一下我有以下文件/模式:
我要计算一组文件中有多少文件:
问题是我不知道我有多少个模式,因为文件太多,所以我不知道是否有A,B,C,D。如何找到所有模式(并计数)?
您可以:
ls -1 | sed -En 's/(.*)_[0-9]+.log/\1_*.log/p' | uniq -c
将输出传送到sed
,以用星号替换数字并计数唯一的条目
一种方法,使用GNU datamash进行计数:
find . -name "log_*.log" -print | datamash -s -t_ -g1,2 count 3 | sed 's/_\([^_]*\)$/_*.log \1/'
或使用awk
:
find . -name "log_*.log" -print | \
awk -F_ '{ counts[$1"_"$2]++ }
END { for (pat in counts) printf "%s_*.log %d\n", pat, counts[pat] }'
仅使用grep。我正在使用“此处文档”,但是您可以通过管道输入。请注意,在下面的示例中,我们仅匹配A
。
grep -Pch '(?<=log_)A(?=_[0-9]{8}\.log)' <<-EOF
log_A_20000101.log
log_A_20200412.log
log_B_20000101.log
log_B_20200412.log
log_C_20000101.log
log_C_20200412.log
log_D_20000101.log
log_D_20200412.log
EOF
一些解释:
(?<=log_) ............. positive look-behind (just validate)
(?=_[0-9]{8}\.log) .... positive look-ahead