Linux sed命令

目录

  • 一. 去除单个指定文本的换行符
  • 二. 去除多个指定文本的换行符
  • 三. 抽取出指定数据
    • 3.1 分别抽取SPLREQUEST和SPLEND的数据
    • 3.2 通过join命令将文件合并
    • 3.3 抽取出指定的数据
    • 3.4 去除换行符,整合数据为一行


一. 去除单个指定文本的换行符

info.txt

Some text before
2023 Some text after
Another 2023 line with 2023
20232023A line with consecutive 2023
Last line 2023

⏹解析

  • :loop; N; $!b loop;用于循环整个文件
  • s/\n2023/ 2023/g用于替换,将换行符2023 替换为 空格2023
cat info.txt | sed ':loop; N; $!b loop; s/\n2023/ 2023/g'

效果

Some text before 2023 Some text after
Another 2023 line with 2023 20232023A line with consecutive 2023
Last line 2023

二. 去除多个指定文本的换行符

a.txt

Start 2023-11-05 05:15:10
eventController=enent1
MemberId=uuidw3e
ExecTime=1000
Start 2023-11-05 05:17:10
eventController=enent2
MemberId=uuidA234
ExecTime=2000

⏹解析

  • s/\n\([eME]\)/ \1/g用于将 换行符e开头的数据,换行符M开头,换行符E开头的数据的换行符去掉,并添加一个空格。
cat ./a.txt | sed ':loop; N; $!b loop; s/\n\([eME]\)/ \1/g'

效果

Start 2023-11-05 05:15:10 eventController=enent1 MemberId=uuidw3e ExecTime=1000
Start 2023-11-05 05:17:10 eventController=enent2 MemberId=uuidA234 ExecTime=2000

三. 抽取出指定数据

如下所示,程序运行后生成了如下log

  • 开头的数字(110120,123456等)代表了线程号
  • SPLREQUEST表示请求的开始,SPLEND表示请求的终了。同一个请求的SPLREQUEST和SPLEND的线程号相同。
  • 因为系统上线运行后,同一时刻可能会存在多个并发请求,所以同一个请求在同一个时刻打印的log可能分布在日志文件的不同的地方。
  • 我们可以根据线程号将同一个请求的SPLREQUEST和SPLEND相关的数据聚合到同一行,然后进行处理。

20231126-2.log

110120 SPLREQUEST 内容1 AAA memberID=1 eventController=event1
110120 SPLEND ExecTime=200 ResultCode=200
123456 SPLEND ExecTime=300 ResultCode=200

123456 SPLREQUEST 内容2 BBB memberID=2 eventController=event2
123444 SPLREQUEST 内容3 CCC memberID=3 eventController=
123434 SPLREQUEST 内容4 DDD memberID=  eventController=event4

123444 SPLEND ExecTime=200 ResultCode=200
123434 SPLEND ExecTime=400 ResultCode=200
345345 SPLEND ExecTime=500 ResultCode=200
345345 SPLREQUEST 内容5 EEE memberID=5 eventController=event5
674545 SPLREQUEST 内容6 FFF memberID=6 eventController=event6

674545 SPLEND ExecTime=400 ResultCode=200

3.1 分别抽取SPLREQUEST和SPLEND的数据

  • 在日志文件中,请求开始的日志和请求结束的日志所在的位置都是错乱无规律的。
  • 我们可以先将请求开始相关的数据抽取到一个文件中
  • 再将请求终了的相关的数据抽取到一个文件中
  • 再将上述得到的两个文件合并

⏹将SPLREQUEST相关的数据抽取到文件中

grep SPLREQUEST ./20231126-2.log > SPLREQUEST.txt

SPLREQUEST.txt

110120 SPLREQUEST 内容1 AAA memberID=1 eventController=event1 
123456 SPLREQUEST 内容2 BBB memberID=2 eventController=event2 
123444 SPLREQUEST 内容3 CCC memberID=3 eventController= 
123434 SPLREQUEST 内容4 DDD memberID=  eventController=event4 
345345 SPLREQUEST 内容5 EEE memberID=5 eventController=event5 
674545 SPLREQUEST 内容6 FFF memberID=6 eventController=event6 

⏹将SPLEND相关的数据抽取到文件中

grep SPLEND ./20231126-2.log > SPLEND.txt

SPLEND.txt

110120 SPLEND ExecTime=200 ResultCode=200 
123456 SPLEND ExecTime=300 ResultCode=200 
123444 SPLEND ExecTime=200 ResultCode=200 
123434 SPLEND ExecTime=400 ResultCode=200 
345345 SPLEND ExecTime=500 ResultCode=200 
674545 SPLEND ExecTime=400 ResultCode=200

3.2 通过join命令将文件合并

⏹由于请求开始和请求终了日志的线程号都是相同的,且都在第一列,因此可以通过join命令将两个文件通过线程号连接起来

join SPLREQUEST.txt SPLEND.txt > ALL.txt

ALL.txt

110120 SPLREQUEST 内容1 AAA memberID=1 eventController=event1  SPLEND ExecTime=200 ResultCode=200
123456 SPLREQUEST 内容2 BBB memberID=2 eventController=event2  SPLEND ExecTime=300 ResultCode=200
123444 SPLREQUEST 内容3 CCC memberID=3 eventController=  SPLEND ExecTime=200 ResultCode=200
123434 SPLREQUEST 内容4 DDD memberID= eventController=event4  SPLEND ExecTime=400 ResultCode=200
345345 SPLREQUEST 内容5 EEE memberID=5 eventController=event5  SPLEND ExecTime=500 ResultCode=200
674545 SPLREQUEST 内容6 FFF memberID=6 eventController=event6  SPLEND ExecTime=400 ResultCode=200

3.3 抽取出指定的数据

⏹抽取出线程号,memberID,eventController,ExecTime。

  • -o表示 只显示匹配到的数据
  • ^\S*表示 非空开头的数据,在此案例中特指线程号
grep -o -a -e "^\S*" -e "eventController=\S*" -e "memberID=\S*" -e "ExecTime=\S*" ALL.txt > pick_data.txt

pick_data.txt

110120
memberID=1
eventController=event1
ExecTime=200
123456
memberID=2
eventController=event2
ExecTime=300
123444
memberID=3
eventController=
ExecTime=200
123434
memberID=
eventController=event4
ExecTime=400
345345
memberID=5
eventController=event5
ExecTime=500
674545
memberID=6
eventController=event6
ExecTime=400

3.4 去除换行符,整合数据为一行

cat pick_data.txt | sed ':loop; N; $!b loop; s/\n\([emE]\)/ \1/g'
110120 memberID=1 eventController=event1 ExecTime=200
123456 memberID=2 eventController=event2 ExecTime=300
123444 memberID=3 eventController= ExecTime=200
123434 memberID= eventController=event4 ExecTime=400
345345 memberID=5 eventController=event5 ExecTime=500
674545 memberID=6 eventController=event6 ExecTime=400

你可能感兴趣的:(Linux,linux)