【问题标题】:Bash Conditionally Remove Line EndingsBash 有条件地删除行尾
【发布时间】:2016-05-16 22:16:17
【问题描述】:

我正在尝试从日志文件中的特定行中删除行尾。目标是从匹配行中删除行尾,然后将这些行附加到与删除行尾条件不匹配的前一行。

示例日志:

[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
Log Message Overflowing
Log Message Overflowing
Log Message Overflowing
Log Message Overflowing
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
Log Message Overflowing
Log Message Overflowing
Log Message Overflowing
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message

示例输出:

[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message Log Message Overflowing Log Message Overflowing Log Message Overflowing Log Message Overflowing
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message Log Message Overflowing Log Message Overflowing Log Message Overflowing
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
[username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message

我不确定解决此问题的最佳方法是什么,并且我在使用 sed 有条件地删除行尾时遇到了一些困难。

可能循环遍历每一行可能是最好的方法?

这是我想出的,它有效,我只是认为会有更好的更简单/更线性的方式。

#!/bin/bash
PrevNoMatchLine=""
PrevMatchLine=""
while read -r line; do 
    if [[ $line =~ ^[^\[] ]]; then
        PrevMatchLine+="$line "
    else
        if [[ $PrevMatchLine ]]; then
            PrevNoMatchLine+=" $PrevMatchLine"
            PrevMatchLine=""
            echo $PrevNoMatchLine
        else
            PrevNoMatchLine=$line
        fi
        echo $line 
    fi
done < test.log

【问题讨论】:

    标签: bash awk sed


    【解决方案1】:

    你可以使用awk:

    awk '{if ($0 ~ /^\[/) {if (p) print p; p=$0} else p = p " " $0} END{print p}' file.log
    
    [username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
    [username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
    [username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
    [username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message Log Message Overflowing Log Message Overflowing Log Message Overflowing Log Message Overflowing
    [username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
    [username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
    [username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
    [username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
    [username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message Log Message Overflowing Log Message Overflowing Log Message Overflowing
    [username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
    [username] [object] [ip address] [datetime] [pid] :>MESSAGE TYPE:Message
    

    【讨论】:

      猜你喜欢
      • 2014-06-08
      • 2017-08-09
      • 1970-01-01
      • 2020-11-22
      • 2017-12-22
      • 1970-01-01
      • 2023-02-21
      • 2012-06-05
      • 2015-08-31
      相关资源
      最近更新 更多