从日志文件中选择主机名

时间:2019-02-26 14:30:09

标签: powershell

我有一个应用程序,可以生成100个类似的文本日志文件

DaemonReruns=2|

Phase=|

Log=false|
DS=LOG_4|
Schema=LOLYY|
DBMS=mssql|
Host=abc.XYz.com|
IDs=xxxxx,xxxx

我需要从这些中选择主机 我尝试过

GC  C:\log_5.txt |
    Select-String -Pattern 'Host=\"([^\"]*)\"'

没有结果,没有帮助吗?

6 个答案:

答案 0 :(得分:3)

示例输入中没有引号。试试这个正则表达式:

get-content C:\log_5.txt | foreach {
    if ($_ -match 'Host=([^|]+)') {
        $Matches.1
    }
}

注意:这实际上返回的是主机名,而不仅仅是行。

答案 1 :(得分:3)

marsze's helpful answer解决了您的正则表达式问题,并使用ForEach-Objectforeach)调用通过-match运算符和自动{{1} }变量。

这是使用switch statement的一种简洁(性能更好)的替代方法:

$Matches

请注意,PS> switch -Regex -File C:\log_5.txt { 'Host=([^|]+)' { $Matches[1] } } abc.XYz.com 不接受基于通配符的路径,因此,要处理多个文件,您必须通过-FileGet-ChildItem遍历它们。

答案 2 :(得分:2)

ngOnInit() { 

//When calling this method the error.interceptor is activated normally
//this.getMostPopularMovies();   

//But when I call direct using the AJAX, the interceptor doesn't work
 this.dtOptions = {
   ajax: {
     url: 'https://api.themoviedb.org/3/discover/movie?sort_by=popularity.desc&api_key=2ed54a614803785fce2d7fe401cc3b21',
     params: {
       api_key: this.moviedbService.apiKey
     },
     dataSrc: 'results'
     //type: 'GET',
     //headers: {"Authorization": 'Bearer ' + JSON.parse(localStorage.getItem('authUser'))["token"]}
   },
   columns: [
     { data: 'title' },
     { data: 'release_date' }
   ]
 };
}

getMostPopularMovies(){

 this.moviedbService.getMostPopularMovies().
   subscribe((movies: any) => {
     this.moviesList = movies.results;

     console.log("====", movies);   
   }, (error: any) => {
     console.error("Erro-> ", error);
 });
}

返回以((Get-Content -Path .\log_5.txt) -match 'Host=') -replace 'Host=','' 开头的所有行

答案 3 :(得分:2)

只是为了好玩... super-fast解决方案:

$regex = [Regex]::new('Host=([^|]+)', 'Compiled, IgnoreCase, CultureInvariant')
& {foreach ($line in [IO.File]::ReadLines("C:\log_5.txt")) {
    $m = $regex.Match($line)
    if ($m.Success) {
        $m.Groups[1].Value
    }
}}

答案 4 :(得分:2)

如果您的日志非常庞大,那么可能值得Add-Type的开销,而其余的则要快得多:

Add-Type '
using System.IO;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace PowerShell
{
    public class Tools
    {
        static Regex regex = new Regex(@"Host=([^|]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
        public static IEnumerable<string> GetHosts(string path)
        {
            foreach(var line in File.ReadLines(path))
            {
                var matches = regex.Match(line);
                if (matches.Success)
                {
                    yield return matches.Groups[1].Value;
                }
            }
        }
    }
}'

# call this for each log file (very fast)
[PowerShell.Tools]::GetHosts("C:\log_5.txt")

答案 5 :(得分:1)

其他答案的正则表达式方面覆盖得足够好。每当我看到这样的小日志时,我总是会想到ConvertFrom-StringData

  

将包含一个或多个键和值对的字符串转换为哈希表。

     

发件人:帮助ConvertFrom-StringData

在基本形式中,我们只需要执行以下操作:

$pairs = Get-Content -Raw -File $pathtofile | ConvertFrom-StringData
[pscustomobject]$pairs

这将为您提供一个可以轻松交互的PowerShell对象!

DS           : LOG_4|
Schema       : LOLYY|
IDs          : xxxxx,xxxx
Log          : false|
DBMS         : mssql|
Host         : abc.XYz.com|
Phase        : |
DaemonReruns : 2|

令人怀疑的是您需要尾随管道。您可以使用一些正则表达式或更简单的字符串方法删除它们。

[pscustomobject](Get-Content -File $pathToFile | ForEach-Object{$_.trimend("|")} | Out-string | ConvertFrom-StringData)

[pscustomobject]((Get-Content -Raw -File $pathToFile) -replace "(?m)\|$" | ConvertFrom-StringData)

无论如何,这为您提供了更多有关如何处理数据的选择。