0

我有一个正在逐行读取的日志文件。

可能的输入:

" 0:00 InitAuth: \auth\0\auth_status\init\auth_cheaters\1\auth_tags\1\auth_notoriety\1\auth_groups\ \auth_owners"

想要的输出:

$TIME = 0:00
$TYPE = InitAuth:
$DATA = \auth\0\auth_status\init\auth_cheaters\1\auth_tags\1\auth_notoriety\1\auth_groups\ \auth_owners

或者$Output[0], $Output[1], $Output[2] 我不在乎它是 1 个数组还是 3 个变量。

起初我正在考虑将该行拆分为 3 个变量并使用分隔符之类的空格,所以我试图搜索 PHP 命令的 sh 替换,explode(' ', $input, 3);但后来我找到了这样的行:

"1728:32ClientUserinfoChanged: 0 n\ThunderBird\t\3\r\2\tl\0\f0\ \f1\ \f2\ \a0\0\a1\0\a2\0"
$TIME = 1728:32
$TYPE = ClientUserinfoChanged:
$DATA = 0 n\ThunderBird\t\3\r\2\tl\0\f0\ \f1\ \f2\ \a0\0\a1

时间和类型信息之间没有空格。所以我想知道,我现在应该如何拆分该文本?

此外,我是 Shell 的新手,我正在搜索所有可能的命令。

4

2 回答 2

0

沿着这条线的东西可能会帮助您获得所需的输出:

sed -r 's/([0-9]+:[0-9]{2})([a-zA-Z ]+:)(.*)/$TIME:\1\n$TYPE:\2\n$DATA:\3/'

测试:

[jaypal:~] echo "1728:32ClientUserinfoChanged: 0 n\ThunderBird\t\3\r\2\tl\0\f0\ \f1\ \f2\ \a0\0\a1\0\a2\0" | gsed -r 's/([0-9 ]+:[0-9]{2})([a-zA-Z ]+:)(.*)/$TIME:\1\n$TYPE:\2\n$DATA:\3/'
$TIME:1728:32
$TYPE:ClientUserinfoChanged:
$DATA: 0 n\ThunderBird\t\3\r\2\tl\0\f0\ \f1\ \f2\ \a0\0\a1\0\a2\0

[jaypal:~] echo "0:00 InitAuth: \auth\0\auth_status\init\auth_cheaters\1\auth_tags\1\auth_notoriety\1\auth_groups\ \auth_owners" | gsed -r 's/([0-9 ]+:[0-9]{2})([a-zA-Z ]+:)(.*)/$TIME:\1\n$TYPE:\2\n$DATA:\3/'
$TIME:0:00
$TYPE: InitAuth:
$DATA: \auth\0\auth_status\init\auth_cheaters\1\auth_tags\1\auth_notoriety\1\auth_groups\ \auth_owners
[jaypal:~]
于 2013-05-25T22:17:28.273 回答
0

所以这就是我想要的,它可以满足我的需要,很好。:)

谢谢杰帕尔。

TIME=`echo $LINE | sed -r 's/([0-9]+:[0-9]{2})(.*)/\1/'`
TYPE=`echo $LINE | sed -r 's/([0-9]+:[0-9]{2})([a-zA-Z ]+:)(.*)/\2/'`
DATA=`echo $LINE | sed -r 's/([0-9]+:[0-9]{2})([a-zA-Z ]+:)(.*)/\3/'`

我猜有人会截断那个:D

于 2013-05-26T08:51:05.383 回答