![返回文本文件中字符串的一部分](https://linux22.com/image/86975/%E8%BF%94%E5%9B%9E%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E4%B8%AD%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86.png)
背景:
所有日志都转至 csv 以便 mysql 导入。
有大量包含以下数据的日志:
Moon,Srv-1,2016-04-04 06:59:48,Entry #103 (s) test (AlphaNum_Need_This_32_Char_Long1),Msg On (ref2357 : Act)
Moon,Srv-2,2016-03-04 06:59:48,Entry #2 SomeLongtest (AlphaNum_Need_This_32_Char_Long2),Msg On (ref2357 : Act)
问题:
如何提取:
AlphaNum_Need_This_32_Char_Long1 AlphaNum_Need_This_32_Char_Long2
或者
丢弃该零件
Entry #103 (s) test
。=> 问题是,该文本的长度和字符与 alpha、num、
( { } [ ] ( ) / \ . < ># @ _ -
现在的进展:
sed
可以使用和提取所有其他字段awk
。在 Excel 中,这将解决问题 {其中文本为 D4}:
=MID(D4,SEARCH("),",D4)-32,32)
到目前为止,一直使用 MS Logparser,反转字符串,搜索计数 32 个字符等。
目标:不要使用 Windows 日志解析器,全部在 Linux 中完成。
答案1
sed -r 's/^.*\((.{32})\).*$/\1/' filename
答案2
在 Perl 中,如果使用负索引,则可以从右侧开始计算字符:
perl -aF, -lne 'print substr $F[3], -33, 32' < input
-n
逐行读取输入-a
将输入拆分到@F
数组中-F
指定要拆分的内容-l
为打印添加换行符