Bash - 过滤文件夹

时间:2016-07-12 06:57:26

标签: bash

所以我遇到了这个问题:我的Ubuntu中有一个包含日志文件的文件夹。所有文件的命名模式如下:

d的 1 .exert。的 -access.log-的 2016年6月28日

有很多文件。我用粗体突出显示了名称的哪个部分可以变化。特定日期和域(.de,.co.uk,.dk等)总是有两个文件,其中一个以d1为前缀,另一个以d2为前缀。我需要为每个日期和域连接d1和d2文件,例如:

1) d1.exert.de_access.log_2016-06-28
2) d1.exert.dk_access.log_2016-06-24
3) d1.exert.dk_access.log_2016-06-25
4) d2.exert.de_access.log_2016-06-28
5) d2.exert.dk_access.log_2016-06-24
6) d2.exert.dk_access.log_2016-06-25

我需要配对和连接文件:1)和4),2)和5),3)和6)因为它们具有相同的域和日期,但前缀不同。

所以我需要遍历文件夹中的所有文件,并为每个日期和域找到这些d1 / d2对。然后我必须连接这些对。我需要编写一个自动查找这些对的脚本。我想过某种双循环(例如,外部搜索日期,内部搜索域),但我不知道如何实现它。或者可能有一些更简单的解决方案?

3 个答案:

答案 0 :(得分:0)

您可以使用 sort 命令对它们进行排序,然后使用 cat 命令对它们进行排序。

示例:

# sort all files
ls *novono* | sort | sort -t '_' -k 3 > files
# get all dates
DATES=`cat files | sed 's/...www.novonordiskpro..._access.log_//' | uniq`
# merge files
for DATE in $DATES; do cat `grep $DATE files` > merge-$DATE; done

答案 1 :(得分:0)

假设文件始终是配对的:

 ls -1 | sort -t\. -k 2 -k 1 | xargs -L2 your_command

这将对文件进行排序,以确保匹配对彼此跟随,然后使用两个参数调用your_command

答案 2 :(得分:0)

script.sh" folderpath"

#! /bin/bash

cd $1;
for i in `ls | awk -F"." '{sz=$2"."$3"."$4"."$5; print sz}' | sort | uniq`
do
    file_d1=d1"."$i;
    file_d2=d2"."$i;

    #echo $file_d1;
    #echo $file_d2;

    cat $file_d1 >> $i;
    cat $file_d2 >> $i;

done

最终的连接文件将存储在" folderpath"以下文件名:

www.novonordiskpro.<domain>_access.log_<date>
Example:
www.novonordiskpro.dk_access.log_2016-06-24
www.novonordiskpro.dk_access.log_2016-06-25