2015-11-25 41 views
1

我一直在尋找,而現在爲解決這個問題: 這是從文本文件output.txt開始的內容(OFC有後續更多的行servernames節點的):[批量]如何刪除使用CMD/PowerShell中不需要的文本

Current query set 
        name: srv-comms-xx; 
        name: easrv00xxx; 
        name: ealxsrv00xxx; 

我需要一個批處理腳本:

  • 移除此f的第一線ILE

  • 刪除一切從其他線路除了servernames節點

所以例子輸出爲:

srv-comms-xx 
easrv00xxx 
ealxsrv00xxx 

我expiremented與FINDSTR但沒有成功。

+0

所以第一行包含'當前查詢set',對不對?以下所有行以[leading _SPACEs_ +]'name:'+ _SPACE_開頭,對吧?如果是這樣,請使用:'>「output_new.txt」(for/F「usebackq skip = 1 tokens = 1,* delims =:」%I in(「output.txt」)do echo%J)' – aschipfl

+0

yes correct Mathias R. Jessen提供的解決方案爲我工作。 – HDemaiter

回答

1

我喜歡以前的答案,而是想告訴你一個簡單的方法可用,如果你可以安裝WMF/PowerShell的版本5

此版本增加了所謂的ConvertFrom-String一個超級強大的新工具。這使用FlashExtract(在Excel中找到)和一個輸入示例文件來智能地從任何給定的輸入中提取值。

如果你想寫一些真的簡潔的代碼,你可以使用這種方法。要製作一個輸入示例文件,只需將您的預期輸出複製並粘貼到記事本中即可。

Current query set 
       name: srv-comms-xx; 
       name: easrv00xxx; 
       name: ealxsrv00xxx; 

接下來,請記下您要選擇的值(在我們的例子中是服務器名稱)。現在,列表中的前幾個服務器名稱將大括號,名稱稱爲提取值,然後在您想要的末尾加上一個大括號。這是一個例子。

Current query set 
        name: {name*:srv-comms-xx}; 
        name: {name*:easrv00xxx}; 
        name: ealxsrv00xxx; 

注意*,它告訴ConvertFrom-String每當我們看到這個值時創建新的對象。

所以,這是我們的示例文件。現在將它保存在某個地方(在我的示例中爲T:\ Example.txt),並使用Convertfrom-String調用它。

Get-Content .\output.txt | ConvertFrom-String -TemplateFile T:\example.txt 

輸出

name   
----   
srv-comms-xx 
easrv00xxx 
ealxsrv00xxx 

注意,我們只提供了兩個例子,但PowerShell的很聰明,識別模式和太提取最終的服務器名稱。即使我們的輸入有成千上萬的名字,我們也只需要前三到四行的示例就PowerShell提供足夠的提示來說明我們想要做什麼。

如果你想刮的文件和服務器名稱,只是管只返回到選擇-Expand名稱,像這樣:

Get-Content .\output.txt | ConvertFrom-String -TemplateFile T:\example.txt | 
    Select-Object -ExpandProperty Name 
+0

哇這是非常非常方便的信息。謝謝一堆! – HDemaiter

1

可以使用-replace操作來去除所述名稱等應有盡有,使用正則表達式:

# Read the file into an array with Get-Content 
$Lines = Get-Content .\output.txt 
# Use Where-Object to filter away lines not containing "name:" 
$Lines = $Lines |Where-Object {$_ -match 'name:'} 
# Use -replace to capture the servername 
$Names = $Lines -replace '^\s+?name:\s(\S+);\s*$','$1' 

您可以將這些報表合併成一個單一的管道:

$Names = Get-Content .\output.txt |Where-Object {$_ -match 'name:'} |ForEach-Object {$_ -replace '^\s+?name:\s(\S+);\s*$','$1'} 
+0

不錯!這工作。謝謝。我還有一個問題,我使用:'$ Names | out-file -filepath hostnames.txt -append'來將數組傳送到文本文件。他們現在只是由空間sepparted。任何方式來設置不同的線上的每個主機文件? – HDemaiter

0

這裏是一個cmd解決方案:

for /F "usebackq skip=1 tokens=2 delims=:; " %I in ("output.txt") do echo %I 

:寫輸出到一個新文件,說output_new.txt,使用重定向:

> "output_new.txt" (for /F "usebackq skip=1 tokens=2 delims=:; " %I in ("output.txt") do echo %I) 

要使用這一切都在一個批處理腳本,雙%跡象:在命令提示符下

> "output_new.txt" (for /F "usebackq skip=1 tokens=2 delims=:; " %%I in ("output.txt") do echo %%I) 

類型for /?爲有關使用for /F解析文本文件的更多信息。

相關問題