我有一个应用程序,可以生成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=\"([^\"]*)\"'
没有结果,没有帮助吗?
答案 0 :(得分:3)
示例输入中没有引号。试试这个正则表达式:
get-content C:\log_5.txt | foreach {
if ($_ -match 'Host=([^|]+)') {
$Matches.1
}
}
注意:这实际上返回的是主机名,而不仅仅是行。
答案 1 :(得分:3)
marsze's helpful answer解决了您的正则表达式问题,并使用ForEach-Object
(foreach
)调用通过-match
运算符和自动{{1} }变量。
这是使用switch
statement的一种简洁(性能更好)的替代方法:
$Matches
请注意,PS> switch -Regex -File C:\log_5.txt { 'Host=([^|]+)' { $Matches[1] } }
abc.XYz.com
不接受基于通配符的路径,因此,要处理多个文件,您必须通过-File
或Get-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)
无论如何,这为您提供了更多有关如何处理数据的选择。