如何根据行中的特定单词逐行排序(迭代字符串)?

时间:2016-10-04 15:49:40

标签: string sorting powershell

我有以下逐行字符串(迭代行):

05-10-2016 15:22:20  %LINEPROTO-5-UPDOWN: Line protocol on Interface Loopback1, changed state to up
05-10-2016 15:22:31  %LINEPROTO-5-UPDOWN: Line protocol on Interface Serial1/0, changed state to down
05-10-2016 15:22:43  %LINEPROTO-5-UPDOWN: Line protocol on Interface Loopback1, changed state to down
05-10-2016 15:22:53  %LINEPROTO-5-UPDOWN: Line protocol on Interface Serial1/0, changed state to up

我想根据接口名称排序行,然后按时间戳排序,所以结果应该是:

05-10-2016 15:22:20  %LINEPROTO-5-UPDOWN: Line protocol on Interface Loopback1, changed state to up
05-10-2016 15:22:43  %LINEPROTO-5-UPDOWN: Line protocol on Interface Loopback1, changed state to down
05-10-2016 15:22:31  %LINEPROTO-5-UPDOWN: Line protocol on Interface Serial1/0, changed state to down
05-10-2016 15:22:53  %LINEPROTO-5-UPDOWN: Line protocol on Interface Serial1/0, changed state to up

有人可以帮我使用PowerShell执行此任务吗?

注意:接口名称可能与上面提到的不同。

2 个答案:

答案 0 :(得分:0)

将数据传输到Sort-Object并使用正则表达式从字符串中提取接口名称:

... | Sort-Object { $_ -replace '.*interface (.*?),.*', '$1' }

但是,这种排序不会保留具有相同接口名称的元素的日期顺序,如注释中指出的@wOxxOm。如果您还需要,还需要修改替换,例如这样的事情:

... | Sort-Object { $_ -replace '^(\S+ \S+).*interface (.*?),.*', '$2 $1' }

答案 1 :(得分:0)

非常感谢Ansgar Wiechers

我没有使用RegEx做了上面提到的那种:

 ...| Sort-Object { $_.split(',')[0].split(' ')[-1] , $_.split('')[0]+" "+$_.split('')[1] }

<强>解释

$_.split(',')[0].split(' ')[-1]       # Extracting Interface name
$_.split('')[0]                       # Extracting Date
$_.split('')[1]                       # Extracting Time