请求编写Linux Bash脚本统计特定格式文本文件的相关数据
嘿,我来帮你搞定这个Bash脚本的编写,专门处理你说的那种格式的文本文件,生成你需要的统计数据~
首先先明确下你的需求:你要处理的文本文件里,每条记录都是以string : "xxx"开头,后面跟着一堆pathnameX : /完整路径的条目,最终要统计每个字符串对应的文件数量、路径列表这类数据对吧?
先理清楚文本格式(修正下你给出的示例,让结构更清晰)
假设你的logfile.txt内容是这样的:
string : "version" pathname1: /home/Desktop/myfile.txt pathname2 : /usr/lib/tmp/sample.txt
string : "user" pathname1 : /var/log/user.log pathname2 : /home/user/docs/profile.txt
方案1:用awk快速处理(推荐,效率更高)
awk天生擅长处理结构化文本,用它来写脚本简洁又高效,下面这个脚本会帮你提取每个字符串对应的所有路径,输出字符串、关联文件数量、完整路径列表:
#!/bin/bash # 先检查用户有没有传入正确的文件参数 if [ $# -ne 1 ]; then echo "用法: $0 <输入文本文件>" exit 1 fi INPUT_FILE="$1" awk ' BEGIN { # 设置分隔符:匹配"string : \""和"pathname数字 : "这两种模式 FS = /string : "|" pathname[0-9]+ : / # 输出字段用制表符分隔,方便阅读 OFS = "\t" } { # 提取当前行的目标字符串,去掉引号 current_str = $2 gsub(/"/, "", current_str) # 遍历所有路径字段(从第三个字段开始) for (i=3; i<=NF; i++) { path = $i # 去掉路径前后的空格 gsub(/^[[:space:]]+|[[:space:]]+$/, "", path) if (path != "") { # 把路径追加到对应字符串的列表里 paths[current_str] = paths[current_str] path " " # 计数加1 count[current_str]++ } } } END { # 输出统计表头 print "字符串\t文件数量\t路径列表" print "---\t---\t---" # 遍历所有统计结果并输出 for (str in count) { print str, count[str], paths[str] } } ' "$INPUT_FILE"
方案2:纯Bash循环实现
如果你更习惯纯Bash代码,不想依赖awk,也可以用下面这个版本:
#!/bin/bash if [ $# -ne 1 ]; then echo "用法: $0 <输入文本文件>" exit 1 fi INPUT_FILE="$1" # 用关联数组存储字符串对应的路径列表和计数 declare -A str_paths declare -A str_count # 逐行读取文件内容 while IFS= read -r line; do # 用正则提取字符串部分(去掉引号) str=$(echo "$line" | grep -oP 'string : "\K[^"]+') if [ -z "$str" ]; then continue # 跳过无效行 fi # 提取所有路径部分 paths=$(echo "$line" | grep -oP 'pathname[0-9]+ : \K[^ ]+') for path in $paths; do # 把路径追加到对应字符串的列表 str_paths["$str"]="${str_paths["$str"]} $path" # 计数加1 ((str_count["$str"]++)) done done < "$INPUT_FILE" # 打印统计结果,用竖线分隔字段 echo "字符串 | 文件数量 | 路径列表" echo "--- | --- | ---" for str in "${!str_count[@]}"; do echo "$str | ${str_count[$str]} | ${str_paths[$str]}" done
怎么用这个脚本?
- 把上面的脚本代码保存成
stats_generator.sh文件 - 给脚本加执行权限:
chmod +x stats_generator.sh - 运行脚本,传入你的文本文件:
./stats_generator.sh logfile.txt
示例输出
假设你的logfile.txt内容是:
string : "version" pathname1: /home/Desktop/myfile.txt pathname2 : /usr/lib/tmp/sample.txt
string : "user" pathname1 : /var/log/user.log pathname2 : /home/user/docs/profile.txt pathname3 : /etc/passwd
运行脚本后会输出:
字符串 文件数量 路径列表 --- --- --- version 2 /home/Desktop/myfile.txt /usr/lib/tmp/sample.txt user 3 /var/log/user.log /home/user/docs/profile.txt /etc/passwd
一些注意事项
- 如果你的路径里包含空格,上面的脚本会出错,这时候需要调整字段分割的逻辑(比如awk里用更精准的分隔,或者Bash里处理带空格的路径)
- 如果有重复的路径,你可以在脚本里加去重逻辑,比如把路径列表用
sort -u处理下
内容的提问来源于stack exchange,提问作者dituoa

