UNIX:仅提取我需要的信息
UNIX: Extracting only the information I need
我在一个文件中有以下内容,我需要将某些内容提取到另一个文件中以便于分析。
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
我想提取错误(DATAUNEXPECTEDSTOREDAY或STOREDAYNOTREADYTOBELOAD) Store (RTLOG_4403_20170108010211_1) 和日期 (RTLOG_4403_20170108010211_1) 到另一个文件,我需要这样的输出:
示例:
- DATAUNEXPECTEDSTOREDAY 4403 20170108
- STOREDAYNOTREADYTOBELOAD 4549 20170126
我已经开发了一个直接从文件 (RTLOGS) 中提取 STORE 和 DATE 的命令,但是直接从这个日志文件中提取会更好。
我的命令:
ls {RTLOG*.failed,RTLOG*.rej} | awk -F'|' '{gsub("_","");打印 substr($0,7,13), $4}'
提前致谢。
即使我真的很喜欢 AWK,在这种情况下,我会使用 sed 命令生成适当的结果:
sed -r 's/^.*error.([A-Z]*).*RTLOG_([0-9]*)_([0-9]{8}).*/||/'
产生这样的东西:
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
@Pedro:尝试:
awk '{match([=10=],/DATAUNEXPECTEDSTOREDAY|STOREDAYNOTREADYTOBELOAD/);if(substr([=10=],RSTART,RLENGTH)){A=substr([=10=],RSTART,RLENGTH)};match([=10=],/RTLOG_.*\.dat/);if(substr([=10=],RSTART,RLENGTH)){split(substr([=10=],RSTART,RLENGTH), Q,"_");print A OFS Q[2] OFS substr(Q[3],1,8)}}' OFS="|" Input_file
我在这里使用 awk 的匹配功能,首先匹配我正在寻找字符串 "DATAUNEXPECTEDSTOREDAY|STOREDAYNOTREADYTOBELOAD",然后检查是否存在 RSTART 和 RLENGTH 的子字符串(RSTART 和 RLENGTH 是将在将在一行中为正则表达式找到匹配),如果是,则将变量 A 的值放入 substr($0,RSTART,RLENGTH)。
然后在下一次匹配检查 RTLOG_.*dat 以从行中获取 "RTLOG_4147_20170101010223_1.dat" 部分,如果找到该匹配则使用 split 将 substr($0,RSTART,RLENGTH) 的值拆分为名为 Q 的数组,其分隔符是 ”_”。然后打印变量 A Q[2] OFS substr(Q[3],1,8) 的值,其中 Q[2] 是数组 Q 的第二个元素,即 4403,4189 等等,然后根据 OP 的要求只取 8来自 RTLOG_4403_20170108010211_1 突出显示部分的字母。
现在也添加 non-one 线性形式的解决方案。
awk '{
match([=11=],/DATAUNEXPECTEDSTOREDAY|STOREDAYNOTREADYTOBELOAD/);
if(substr([=11=],RSTART,RLENGTH)){
A=substr([=11=],RSTART,RLENGTH)
};
match([=11=],/RTLOG_.*\.dat/);
if(substr([=11=],RSTART,RLENGTH)){
split(substr([=11=],RSTART,RLENGTH), Q,"_");
print A OFS Q[2] OFS substr(Q[3],1,8)
}
}
' OFS="|" Input_file
我在一个文件中有以下内容,我需要将某些内容提取到另一个文件中以便于分析。
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
我想提取错误(DATAUNEXPECTEDSTOREDAY或STOREDAYNOTREADYTOBELOAD) Store (RTLOG_4403_20170108010211_1) 和日期 (RTLOG_4403_20170108010211_1) 到另一个文件,我需要这样的输出:
示例:
- DATAUNEXPECTEDSTOREDAY 4403 20170108
- STOREDAYNOTREADYTOBELOAD 4549 20170126
我已经开发了一个直接从文件 (RTLOGS) 中提取 STORE 和 DATE 的命令,但是直接从这个日志文件中提取会更好。
我的命令: ls {RTLOG*.failed,RTLOG*.rej} | awk -F'|' '{gsub("_","");打印 substr($0,7,13), $4}'
提前致谢。
即使我真的很喜欢 AWK,在这种情况下,我会使用 sed 命令生成适当的结果:
sed -r 's/^.*error.([A-Z]*).*RTLOG_([0-9]*)_([0-9]{8}).*/||/'
产生这样的东西:
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
@Pedro:尝试:
awk '{match([=10=],/DATAUNEXPECTEDSTOREDAY|STOREDAYNOTREADYTOBELOAD/);if(substr([=10=],RSTART,RLENGTH)){A=substr([=10=],RSTART,RLENGTH)};match([=10=],/RTLOG_.*\.dat/);if(substr([=10=],RSTART,RLENGTH)){split(substr([=10=],RSTART,RLENGTH), Q,"_");print A OFS Q[2] OFS substr(Q[3],1,8)}}' OFS="|" Input_file
我在这里使用 awk 的匹配功能,首先匹配我正在寻找字符串 "DATAUNEXPECTEDSTOREDAY|STOREDAYNOTREADYTOBELOAD",然后检查是否存在 RSTART 和 RLENGTH 的子字符串(RSTART 和 RLENGTH 是将在将在一行中为正则表达式找到匹配),如果是,则将变量 A 的值放入 substr($0,RSTART,RLENGTH)。 然后在下一次匹配检查 RTLOG_.*dat 以从行中获取 "RTLOG_4147_20170101010223_1.dat" 部分,如果找到该匹配则使用 split 将 substr($0,RSTART,RLENGTH) 的值拆分为名为 Q 的数组,其分隔符是 ”_”。然后打印变量 A Q[2] OFS substr(Q[3],1,8) 的值,其中 Q[2] 是数组 Q 的第二个元素,即 4403,4189 等等,然后根据 OP 的要求只取 8来自 RTLOG_4403_20170108010211_1 突出显示部分的字母。
现在也添加 non-one 线性形式的解决方案。
awk '{
match([=11=],/DATAUNEXPECTEDSTOREDAY|STOREDAYNOTREADYTOBELOAD/);
if(substr([=11=],RSTART,RLENGTH)){
A=substr([=11=],RSTART,RLENGTH)
};
match([=11=],/RTLOG_.*\.dat/);
if(substr([=11=],RSTART,RLENGTH)){
split(substr([=11=],RSTART,RLENGTH), Q,"_");
print A OFS Q[2] OFS substr(Q[3],1,8)
}
}
' OFS="|" Input_file