Linux上的目录中有许多文件,每个文件都包含version
行,格式为:#version x
(其中x是版本号)。
我正试图找到一种方法来计算每个文件在所有文件中出现的不同版本的次数,并输出如下内容:
#version 1: 12
#version 2: 36
#version 3: 2
我不知道可能存在的所有潜在版本,所以我真的在尝试匹配包含#version
的行。
我尝试使用grep -c
之类的东西-但是,这仅给出了包含#version
的所有行的总数-我找不到一种很好的方法来分割不同的版本号。
答案 0 :(得分:1)
类似这样的方法可能会解决问题:
grep -h '#version' * | sort | uniq -c | awk '{print $2,$3": found "$1}'
示例文件:
filename:filecontent
file1:#version 1
file1.1:#version 1
file111:#version 1
file2:#version 2
file3:#version 3
file4:#version 4
file44:#version 4
输出:
#version 1: found 3
#version 2: found 1
#version 3: found 1
#version 4: found 2
grep version *
获取所有带有版本的文件。sort
对uniq -c
的结果进行排序,计算重复的次数,然后awk
重新排列输出以进行所需的格式设置。
注意:grep
的分隔符可能与操作系统上的:
略有不同。
答案 1 :(得分:1)
可能传递多个命令:
strings * | grep '#version \w' | sort | uniq --count | awk '{printf("%s: %s\n", substr($0, index($0, $2)), $1)}''
操作明细:
strings *
:从*
提取当前目录中所有文件的文本字符串。| grep '#version \w'
:将字符串传递到grep
命令中,以查找所有出现的#version word
。sort
:将版本字符串传递到sort
命令。| uniq --count
:将#version
行的出现管道输送到uniq
命令中,以输出每个#version...
字符串的计数。awk '{printf("%s: %s\n", substr($0, index($0, $2)), $1)}'
:将唯一计数发送到awk
命令中,以将输出重新格式化为:#version ...: count
。测试过程:
cd /tmp
mkdir testing 2>/dev/null || true
cd testing
# Create 10 testfile#.txt with random #version 1 to 4
for i in {1..10}; do
echo "#version $(($RANDOM%4+1))" >"testfile${i}.txt"
done
# Now get the counts per version
strings * \
| grep '#version \w' \
| sort \
| uniq --count \
| awk '{printf("%s: %s\n", substr($0, index($0, $2)), $1)}'
测试输出示例:
#version 1: 4
#version 2: 2
#version 3: 1
#version 4: 3