天天看點

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
           

繼續閱讀