2017-02-09 78 views
1

我在文件中包含以下內容,並且需要將某些內容提取到另一個文件以使分析更容易。UNIX:僅提取我需要的信息


saimptlogi_1~20170208022514~procRTLFHead~~103~RET-0103: generic function processing error~DATAUNEXPECTEDSTOREDAY on FHEAD record at line 0000000001 in /oretail/apprms/mmhome/data/in/RTLOG_4403_20170115010230_1.dat 
saimptlogi_1~20170208022549~procRTLFHead~~103~RET-0103: generic function processing error~DATAUNEXPECTEDSTOREDAY on FHEAD record at line 0000000001 in /oretail/apprms/mmhome/data/in/RTLOG_4189_20170122010240_1.dat 
saimptlogi_1~20170208022555~procRTLFHead~~103~RET-0103: generic function processing error~DATAUNEXPECTEDSTOREDAY on FHEAD record at line 0000000001 in /oretail/apprms/mmhome/data/in/RTLOG_4403_20170116010200_1.dat 
saimptlogi_1~20170208022556~procRTLFHead~~103~RET-0103: generic function processing error~DATAUNEXPECTEDSTOREDAY on FHEAD record at line 0000000001 in /oretail/apprms/mmhome/data/in/RTLOG_4189_20170108010210_1.dat 
saimptlogi_1~20170208022610~procRTLFHead~~103~RET-0103: generic function processing error~DATAUNEXPECTEDSTOREDAY on FHEAD record at line 0000000001 in /oretail/apprms/mmhome/data/in/RTLOG_4147_20170101010223_1.dat 
saimptlogi_1~20170208022643~procRTLFHead~~103~RET-0103: generic function processing error~DATAUNEXPECTEDSTOREDAY on FHEAD record at line 0000000001 in /oretail/apprms/mmhome/data/in/RTLOG_4189_20170107010206_1.dat 
saimptlogi_1~20170208022703~procRTLFHead~~103~RET-0103: generic function processing error~STOREDAYNOTREADYTOBELOAD on FHEAD record at line 0000000001 in /oretail/apprms/mmhome/data/in/RTLOG_4549_20170126010247_7.dat 
saimptlogi_1~20170208022707~procRTLFHead~~103~RET-0103: generic function processing error~DATAUNEXPECTEDSTOREDAY on FHEAD record at line 0000000001 in /oretail/apprms/mmhome/data/in/RTLOG_4189_20170114010259_1.dat 
saimptlogi_1~20170208022736~procRTLFHead~~103~RET-0103: generic function processing error~DATAUNEXPECTEDSTOREDAY on FHEAD record at line 0000000001 in /oretail/apprms/mmhome/data/in/RTLOG_4403_20170108010211_1.dat 

我想誤差(DATAUNEXPECTEDSTOREDAYSTOREDAYNOTREADYTOBELOAD)商店(RTLOG_ _20170108010211_1)和日期(RTLOG_4403_ 010211_1)提取到另一個文件我需要的輸出是這樣的:

例子:

  • DATAUNEXPECTEDSTOREDAY 4403 20170108
  • STOREDAYNOTREADYTOBELOAD 4549 20170126

我已經開發了一個命令提取存儲和直接從這些文件(RTLOGS)的日期,但它會更好地直接從這個日誌文件中提取。

我的命令: ls {RTLOG * .failed,RTLOG * .rej} | awk -F'|' '{gsub(「_」,「」);打印substr($ 0,7,13),$ 4}'

在此先感謝您。

+0

爲什麼這是用Oracle標記的? – BobC

+0

因爲saimptlogi是一個oracle進程。 –

+0

這不是使用Oracle進行標記的原因。 Oracle標籤適用於需要Oracle方法的問題;你的問題顯然是一個UNIX問題。(如果我在Oracle表中有「法語」一詞,那麼沒有理由用「法語」來標記該文章,是嗎?) – mathguy

回答

0

@Pedro:嘗試:

awk '{match($0,/DATAUNEXPECTEDSTOREDAY|STOREDAYNOTREADYTOBELOAD/);if(substr($0,RSTART,RLENGTH)){A=substr($0,RSTART,RLENGTH)};match($0,/RTLOG_.*\.dat/);if(substr($0,RSTART,RLENGTH)){split(substr($0,RSTART,RLENGTH), Q,"_");print A OFS Q[2] OFS substr(Q[3],1,8)}}' OFS="|" Input_file 

這裏我使用了awk的匹配功能和首次匹配我正在尋找字符串「DATAUNEXP ECTEDSTOREDAY | STOREDAYNOTREADYTOBELOAD「,然後檢查是否存在RSTART和RLENGTH的子字符串(RSTART和RLENGTH是當在一行中找到匹配正則表達式時將設置的變量),如果是,則將變量A的值放入substr( $ 0時,RSTART,RLENGTH)。 然後在下一次匹配檢查RTLOG _。* dat以從行中獲得「RTLOG_4147_20170101010223_1.dat」部分,如果找到該匹配,則使用split將substr($ 0,RSTART,RLENGTH)的值拆分成一個名爲Q的數組分隔符是「_」。然後打印變量AQ [2] OFS substr(Q [3],1,8)的值,其中Q [2]是數組Q的第二個元素,它是4403,4189依此類推,然後根據OP的請求只需要8來自RTLOG_4403_的信件 _1突出顯示的部分。

現在也添加一種非線性形式的解決方案。

awk '{ 
     match($0,/DATAUNEXPECTEDSTOREDAY|STOREDAYNOTREADYTOBELOAD/); 
     if(substr($0,RSTART,RLENGTH)){ 
             A=substr($0,RSTART,RLENGTH) 
            }; 
     match($0,/RTLOG_.*\.dat/); 
     if(substr($0,RSTART,RLENGTH)){ 
             split(substr($0,RSTART,RLENGTH), Q,"_"); 
             print A OFS Q[2] OFS substr(Q[3],1,8) 
            } 
    } 
    ' OFS="|" Input_file 
+0

它完美地工作!謝謝! 輸出繼電器: DATAUNEXPECTEDSTOREDAY | 4403 | 20170115 DATAUNEXPECTEDSTOREDAY | 4189 | 20170122 DATAUNEXPECTEDSTOREDAY | 4403 | 20170116 DATAUNEXPECTEDSTOREDAY | 4189 | 20170108 DATAUNEXPECTEDSTOREDAY | 4147 | 20170101 DATAUNEXPECTEDSTOREDAY | 4189 | 20170107 STOREDAYNOTREADYTOBELOAD | 4549 | 20170126 DATAUNEXPECTEDSTOREDAY | 4189 | 20170114 DATAUNEXPECTEDSTOREDAY | 4403 | 20170108 –

+0

很高興它爲你工作佩德羅,保持它,不斷學習:) – RavinderSingh13

+0

謝謝:)我會的。 –

0

即使我真的很喜歡AWK,在這種情況下,我會使用sed命令來生成一個適當的結果:

sed -r 's/^.*error.([A-Z]*).*RTLOG_([0-9]*)_([0-9]{8}).*/\1|\2|\3/' 

產生這樣的:

DATAUNEXPECTEDSTOREDAY|4403|20170115 
DATAUNEXPECTEDSTOREDAY|4189|20170122 
DATAUNEXPECTEDSTOREDAY|4403|20170116 
DATAUNEXPECTEDSTOREDAY|4189|20170108 
DATAUNEXPECTEDSTOREDAY|4147|20170101 
DATAUNEXPECTEDSTOREDAY|4189|20170107 
STOREDAYNOTREADYTOBELOAD|4549|20170126 
DATAUNEXPECTEDSTOREDAY|4189|20170114 
DATAUNEXPECTEDSTOREDAY|4403|20170108 
+0

我試圖這樣運行: sed -r err.saimptlogi * ([AZ] *)。* RTLOG _([0-9] *)_([0-9] {8})。*/\ 1 | \ 2 | \ 3 /' 但我收到以下錯誤: sed:非法選項-r 用法:sed [-n]腳本[文件...] sed [-n] [-e腳本] ... [ -f script_file] ... [文件...] –

+0

不可以,請嘗試像這樣: sed -r'allTheScript'YourFile.txt – kcoder24