在数据

时间:2015-10-30 19:36:56

标签: linux awk find cat

我有几个包含数据的日志文件。我想要做的是将所有这些文件合并到一个文件中。但在数据进入之前,我希望文件名在那里没有扩展名。例如: 我有的文件:

file1.log file2.log file3.log

我想要的文件:all.log

all.log包含在其中:

file1
    file1's data
file2
    file2's data
file3
    file3's data

3 个答案:

答案 0 :(得分:1)

使用awk

awk 'FNR==1{sub(/[.][^.]*$/, "", FILENAME); print FILENAME} 1' file*.log >all.log

FNR是文件记录号。它是每个文件开头的一个。因此,测试FNR==1告诉我们我们是否在文件的开头。如果我们是,那么我们使用sub(/[.][^.]*$/, "", FILENAME)从文件名中删除扩展名,然后我们打印它。

该计划中的最终1是awk用这种说法打印这条线的神秘方式。

重定向>all.log将文件all.log中的所有输出保存。

使用shell

for f in file*.log; do echo "${f%.*}"; cat "$f"; done >all.log

或者:

for f in file*.log
do 
    echo "${f%.*}"
    cat "$f"
done >all.log

在shell中,for f in file*.log; do在与glob file*.log匹配的所有文件上启动循环。语句echo "${f%.*}"打印文件名减去扩展名。 ${f%.*}后缀删除的示例。 cat "$f"打印文件的内容。 done >all.log终止循环并将所有输出保存在all.log

即使文件名包含空格,制表符,换行符或其他困难字符,此循环也能正常工作。

答案 1 :(得分:0)

假设您有两个文件:

FOO:

a
b
c

栏:

d
e
f

使用Perl:

perl -lpe 'print $ARGV if $. == 1; close(ARGV) if eof' foo bar > all.log

foo
a
b
c
bar
d
e
f

$.是行号
$ARGV是当前文件的名称
close(ARGV) if eof重置每个文件末尾的行号

使用grep:

grep '' foo bar > all.log

foo:a
foo:b
foo:c
bar:d
bar:e
bar:f

答案 2 :(得分:0)

for i in `ls file*`; do `echo $i | awk -F"." '{print $1}' >> all.log; cat $i >> all.log`; done