列出目录中具有模式的分组文件

问题描述 投票:-1回答:3

想象一下我有以下文件/模式:

  • 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

我要计算一组文件中有多少文件:

  • log_A _ *。log 1234
  • log_B _ *。log 3245
  • log_C _ *。log 2343
  • log_D _ *。log 6435

问题是我不知道我有多少个模式,因为文件太多,所以我不知道是否有A,B,C,D。如何找到所有模式(并计数)?

shell zsh
3个回答
0
投票

您可以:

ls -1 | sed -En 's/(.*)_[0-9]+.log/\1_*.log/p' | uniq -c

将输出传送到sed,以用星号替换数字并计数唯一的条目


2
投票

一种方法,使用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] }'

0
投票

仅使用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
热门问题
推荐问题
最新问题