列出目录中具有模式的分组文件
list grouped files with pattern in a directory
假设我有以下 files/pattern:
- 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
问题是文件太多,不知道有多少pattern,不知道有没有A、B、C、D。
我怎样才能找到所有模式(并计算它们)?
您可以:
ls -1 | sed -En 's/(.*)_[0-9]+.log/_*.log/p' | uniq -c
将您的输出通过管道传输到 sed
以用星号替换数字并计算唯一条目
一种方法,使用 GNU datamash 进行计数:
find . -name "log_*.log" -print | datamash -s -t_ -g1,2 count 3 | sed 's/_\([^_]*\)$/_*.log /'
或使用awk
:
find . -name "log_*.log" -print | \
awk -F_ '{ counts["_"]++ }
END { for (pat in counts) printf "%s_*.log %d\n", pat, counts[pat] }'
仅使用 grep。我正在使用 "here document" 但您可以通过管道输入。请注意,在下面的示例中,我们仅匹配 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
假设我有以下 files/pattern:
- 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
问题是文件太多,不知道有多少pattern,不知道有没有A、B、C、D。 我怎样才能找到所有模式(并计算它们)?
您可以:
ls -1 | sed -En 's/(.*)_[0-9]+.log/_*.log/p' | uniq -c
将您的输出通过管道传输到 sed
以用星号替换数字并计算唯一条目
一种方法,使用 GNU datamash 进行计数:
find . -name "log_*.log" -print | datamash -s -t_ -g1,2 count 3 | sed 's/_\([^_]*\)$/_*.log /'
或使用awk
:
find . -name "log_*.log" -print | \
awk -F_ '{ counts["_"]++ }
END { for (pat in counts) printf "%s_*.log %d\n", pat, counts[pat] }'
仅使用 grep。我正在使用 "here document" 但您可以通过管道输入。请注意,在下面的示例中,我们仅匹配 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