天天看点

Linux遍历目录,获取文件的指定内容问题描述:问题分析:注意事项shell代码:

问题描述:

    在当前用户路径下的log文件夹中存在几个文件,从这些文件中读取包含“qa_control_param”的行中的appkey字段的值,并去重后存入当前用户路径下的data文件夹中,文件命名为appkey.txt。

问题分析:

1)循环遍历log目录:for file in `ls ~/log`

2)获取文件中包含“qa_control_param”的行信息:cat $filelist"/"$file"|grep -w "qa_control_param"

3)用正则表达式匹配appkey(要获取的内容放在小括号中,而小括号是特殊字符需要转义):.*"appkey\":\"\([^\"]*\)\".*

4)匹配出第二步中获取到的行中的信息,并只显示这些appkey的内容:

    cat ~/log/"$file"|grep -w "qa_control_param" | sed 's/.*"appkey\":\"\([^\"]*\)\".*/\1/'

5)去重后输入到文件:cat ~/log/"$file"|grep -w "qa_control_param" | sed 's/.*"appkey\":\"\([^\"]*\)\".*/\1/' | sort -u > ~/data/appkey

6)做到这里就以为ok了?No!因为有很多个文件,这个去重只是对每个单个文件进行了去重,还需要进行总体内容的去重,所以这里在循环遍历完成后,重新读取文件,然后去重再写回来:cat ~/data/appkey | sort -u > $temfile

注意事项

到这里基本就完成了,只剩下一些细节的优化:

a)把里面的文件路径提取出来,用变量替换,这样更方便复用;

b)这里我在操作之前先把中间文件清空了,这个主要是保证以前的内容不会对本次操作造成影响:cat /dev/null > $appkeyfile。

c)执行完操作,最好还是删除中间文件:rm $temfile。

d)新手预警:在for file in `ls $filelist`中,用的不是单引号,是反引号!!!也就是键盘上tab键上面的那个键,这个务必要注意。shell用反引号来引用命令。

e)新手预警V2:一定要使用一个中间文件,不能直接把文件存入目标文件最后再从目标文件中取出来去重放回去,因为同一个文件不能既做输入又做输出。

f)这里为了看着输入,把命令封装成了两个函数,这样直接执行两个函数即可。

shell代码:

#!/bin/bash
filelist=~/log/
temfile=~/data/tem
appkeyfile=~/data/appkey.txt
function readfile(){
        cat /dev/null > $appkeyfile
        for file in `ls $filelist`
        do
                echo file: $file
                cat $filelist"/"$file"|grep -w "qa_control_param" | sed 's/.*"appkey\":\"\([^\"]*\)\".*/\1/' | sort -u > $temfile
        done
}

function deduplicate(){
        cat $temfile | sort -u > $appkeyfile
        rm $temfile
}

readfile
deduplicate
           

继续阅读