You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求编写Linux Bash脚本统计特定格式文本文件的相关数据

嘿,我来帮你搞定这个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

怎么用这个脚本?

  1. 把上面的脚本代码保存成stats_generator.sh文件
  2. 给脚本加执行权限:chmod +x stats_generator.sh
  3. 运行脚本,传入你的文本文件:./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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:45:31