我有一个文本文件TEST.txt,它包含以下未格式化的数据:
0411 14:30:00 INF[baag.reporting.main.Logss.ExecuteLogsRunnable] Executing cron report Freigabe 14:30 for cron job Freigabe 14:30 for TRE_ClientServiceGroup@TEST.fs, Businesspartner@TEST.fs
0411 14:30:02 INF[baag.reporting.main.Logss.ExecuteLogsRunnable] Freigaben had no results
0411 14:30:02 INF[baag.reporting.main.Logss.ExecuteLogsRunnable] Freigabe 14:30 NOT sent to TRE_ClientServiceGroup@TEST.fs, Businesspartner@TEST.fs since all reports were empty and empty reports should not be send
0411 17:03:14 INF[baag.reporting.db.DataSourceMapFactory] Datasource [itraderdbint] has been added to datasource map
0411 17:03:14 INF[baag.reporting.db.DataSourceMapFactory] Datasource [otc_sv2599] has been added to datasource map
0411 17:03:14 INF[baag.reporting.db.DataSourceMapFactory] Datasource [qlp_devp] has been added to datasource map
0411 17:03:15 INF[baag.reporting.main.Logss.QuarzLogsManager] Added Trigger for QUARTZ that fires next on Tue Apr 13 08:00:00 CEST 2021 for Logs Compliance MAR Crossingprüfung/Frontrunning DI-FR
0411 17:03:15 INF[baag.reporting.main.Logss.QuarzLogsManager] Added Trigger for QUARTZ that fires next on Tue Apr 13 08:20:00 CEST 2021 for Logs Compliance OR Umsatzstatistik DI-FR
0411 17:03:15 INF[baag.reporting.main.Logss.QuarzLogsManager] Added Trigger for QUARTZ that fires next on Mon Apr 12 08:20:00 CEST 2021 for Logs Compliance OR Umsatzstatistik MO现在我想创建外壳脚本,它将准备这种未格式化的数据为下面的格式,并创建例如PrepardFile.txt。我想用管道运算符分隔每个字符串。第一部分是日期格式,所以我希望这是一个完整的字符串。第二部分始终以INF[开头,以]结尾,或者我们可以从INF[开始,不带空格地使用完整的部分,这将是我作为管道操作符分隔的第二个字符串。第三部分将是剩余的部分,这将是我的第三个字符串。为了更好地理解此字段值的含义,我想添加header:
DATE_FORMAT|ROW_EXECUTE|ROW_VALUE
0411 14:30:00|INF[baag.reporting.main.Logss.ExecuteLogsRunnable]|Executing cron report Freigabe 14:30 for cron job Freigabe 14:30 for TRE_ClientServiceGroup@TEST.fs, Businesspartner@TEST.fs
0411 14:30:02|INF[baag.reporting.main.Logss.ExecuteLogsRunnable]|Freigaben had no results
0411 14:30:02|INF[baag.reporting.main.Logss.ExecuteLogsRunnable]|Freigabe 14:30 NOT sent to TRE_ClientServiceGroup@TEST.fs, Businesspartner@TEST.fs since all reports were empty and empty reports should not be send
0411 17:03:14|INF[baag.reporting.db.DataSourceMapFactory]|Datasource [itraderdbint] has been added to datasource map
0411 17:03:14|INF[baag.reporting.db.DataSourceMapFactory]|Datasource [otc_sv2599] has been added to datasource map
0411 17:03:14|INF[baag.reporting.db.DataSourceMapFactory]|Datasource [qlp_devp] has been added to datasource map
0411 17:03:15|INF[baag.reporting.main.Logss.QuarzLogsManager]|Added Trigger for QUARTZ that fires next on Tue Apr 13 08:00:00 CEST 2021 for Logs Compliance MAR Crossingprüfung/Frontrunning DI-FR
0411 17:03:15|INF[baag.reporting.main.Logss.QuarzLogsManager]|Added Trigger for QUARTZ that fires next on Tue Apr 13 08:20:00 CEST 2021 for Logs Compliance OR Umsatzstatistik DI-FR
0411 17:03:15|INF[baag.reporting.main.Logss.QuarzLogsManager]|Added Trigger for QUARTZ that fires next on Mon Apr 12 08:20:00 CEST 2021 for Logs Compliance OR Umsatzstatistik MO我对Shell脚本非常陌生,不知道这是否可能与shell脚本的帮助有关。
发布于 2021-04-12 20:03:24
@Symonds
此回复是关于您的评论,要求添加标题部分和进一步的解释。
要添加header部分,可以先使用echo并创建PreparedFile.txt。然后使用>>运算符附加到文件。可以将完整的代码复制到名为Script.sh的文件中,然后使用bash Script.sh运行该文件
#!/bin/bash
echo "DATE_FORMAT|ROW_EXECUTE|ROW_VALUE" > PreparedFile.txt
cat TEST.txt | sed 's/ /|/2' | sed 's/] /]|/1' >> PreparedFile.txt就您所要求的解释而言,您可以使用管道符号|链接命令。sed命令允许您用替换来替换指定的正则表达式。在cat命令之后的第一个管道中,我使用了s/ /|/2。这意味着用|替换第二次出现的空格。您可以阅读有关sed命令用法here的更多信息。
发布于 2021-04-12 16:52:36
您可以使用下面的Shell脚本,看看它是否有帮助。它使用sed命令和管道组合来替换第二次出现的空格,然后替换闭方括号。
cat TEST.txt | sed 's/ /|/2' | sed 's/] /]|/1' > PreparedFile.txt
https://stackoverflow.com/questions/67055117
复制相似问题