linux - 在具有相似文件的目录中进行尾部操作

标签 linux bash ubuntu file-io tail

我正在寻找一种聪明的方法来处理这种情况。

cpu-0fhcount 目录下,有很多文件,但可以将它们归为一些名称。

这是目录和文件的鸟瞰图。

../cpu-0/
        cpu-idle-01-01-2016
        cpu-idle-02-01-2016
        cpu-idle-03-01-2016
        .
        .
        cpu-interrupt-01-01-2016
        cpu-interrupt-02-01-2016
        cpu-interrupt-03-01-2016
        .
        .
        .
        cpu-nice-01-01-2016
        cpu-nice-02-01-2016
        .
        .
../fhcount/
        file_handles-max-01-01-2016
        file_handles-max-02-01-2016
        file_handles-max-03-01-2016
        .
        .
        file_handles-unused-01-01-2016
        file_handles-unused-02-01-2016
        file_handles-unused-03-01-2016
        .
        .
        .
        file_handles-used-01-01-2016
        file_handles-used-02-01-2016
        .
        .

如您所见,有一个模式。我通过硬编码收集了它们,以便 tail 相关文件。

curdir="${PWD%}"

tail -q -n +2 $curdir/cpu-0/cpu-idle* > cpu-idle_combined
tail -q -n +2 $curdir/cpu-0/cpu-interrupt* > cpu-interrupt_combined
tail -q -n +2 $curdir/cpu-0/cpu-nice* > cpu-nice_combined

tail -q -n +2 $curdir/fhcount/file_handles-max* > file_handles-max_combined
tail -q -n +2 $curdir/fhcount/file_handles-unused-* > file_handles-unused_combined
tail -q -n +2 $curdir/fhcount/file_handles-used-* > file_handles-unused_combined

我怎样才能做同样的事情,但这次更聪明?

最佳答案

这会遍历子目录中的所有文件,收集文件名的公共(public)部分,然后将它们打印到组合的输出文件中:

#!/bin/bash

# Required for the +(pattern) glob
shopt -s extglob

# Associative array used as set of unique file name roots
declare -A roots

# Shorten names like cpu-0/cpu-idle-01-01-2016 to cpu-0/cpu-idle
# +([[:digit:]-]) matches digits and hyphens
# ${fname%%pattern) removes the longest match of pattern from the end of fname
for fname in */*; do
    roots["${fname%%+([[:digit:]-])}"]=1
done

# Loop through unique roots, print to output files
for fname in "${!roots[@]}"; do
    tail -q -n +2 "$fname"* > "$fname"_combined
done

关联数组需要 Bash 4.0 或更新版本。

例如输入文件结构

.
├── cpu-0
│   ├── cpu-idle-01-01-2016
│   ├── cpu-idle-02-01-2016
│   ├── cpu-idle-03-01-2016
│   ├── cpu-interrupt-01-01-2016
│   ├── cpu-interrupt-02-01-2016
│   ├── cpu-interrupt-03-01-2016
│   ├── cpu-nice-01-01-2016
│   ├── cpu-nice-02-01-2016
│   └── cpu-nice-03-01-2016
└── fhcount
    ├── file_handles-max-01-01-2016
    ├── file_handles-max-02-01-2016
    ├── file_handles-max-03-01-2016
    ├── file_handles-unused-01-01-2016
    ├── file_handles-unused-02-01-2016
    ├── file_handles-unused-03-01-2016
    ├── file_handles-used-01-01-2016
    ├── file_handles-used-02-01-2016
    └── file_handles-used-03-01-2016

结果输出结构是

.
├── cpu-0
│   ├── cpu-idle-01-01-2016
│   ├── cpu-idle-02-01-2016
│   ├── cpu-idle-03-01-2016
│   ├── cpu-idle_combined
│   ├── cpu-interrupt-01-01-2016
│   ├── cpu-interrupt-02-01-2016
│   ├── cpu-interrupt-03-01-2016
│   ├── cpu-interrupt_combined
│   ├── cpu-nice-01-01-2016
│   ├── cpu-nice-02-01-2016
│   ├── cpu-nice-03-01-2016
│   └── cpu-nice_combined
└── fhcount
    ├── file_handles-max-01-01-2016
    ├── file_handles-max-02-01-2016
    ├── file_handles-max-03-01-2016
    ├── file_handles-max_combined
    ├── file_handles-unused-01-01-2016
    ├── file_handles-unused-02-01-2016
    ├── file_handles-unused-03-01-2016
    ├── file_handles-unused_combined
    ├── file_handles-used-01-01-2016
    ├── file_handles-used-02-01-2016
    ├── file_handles-used-03-01-2016
    └── file_handles-used_combined

例如输入文件内容如

$ head cpu-idle*
==> cpu-idle-01-01-2016 <==
1cpu-idle-01-01-2016
2cpu-idle-01-01-2016
3cpu-idle-01-01-2016

==> cpu-idle-02-01-2016 <==
1cpu-idle-02-01-2016
2cpu-idle-02-01-2016
3cpu-idle-02-01-2016

==> cpu-idle-03-01-2016 <==
1cpu-idle-03-01-2016
2cpu-idle-03-01-2016
3cpu-idle-03-01-2016

合并后的输出文件包含

$ cat cpu-idle_combined
2cpu-idle-01-01-2016
3cpu-idle-01-01-2016
2cpu-idle-02-01-2016
3cpu-idle-02-01-2016
2cpu-idle-03-01-2016
3cpu-idle-03-01-2016

关于linux - 在具有相似文件的目录中进行尾部操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44286820/

相关文章:

linux - CentOS 上没有 sudo 的 NodeJS 和 npm

php - 404 未找到,请求的 URL <<url name>> 在 wordpress 的此服务器上未找到

linux - 如何使用 ping 返回值来触发 bash 命令

bash - 将命令作为参数传递给 bash 脚本

python - ubuntu 14.04 pyenv 安装失败

linux - 如何更改 Ubuntu/snap 文件夹中的文件?

python-3.x - "can' t 将用户与前缀结合起来“尝试为具有依赖项的函数创建 zip 包

c - printf() 在c 中用%p 格式打印的地址是哪个?

c - 数组和段错误

linux - umask 会影响消息队列吗?