2016-01-04 78 views
0

我想讀取一個文件並使用shellscript將其打印到標準輸出。在python rsplit可以做這項工作,但我搜索並找到awk,但我無法理解。解析shell腳本中的文本文件

文件1:

#begin cow 
Host cow 
    HostName 172.18.0.10 
    User root 
    Port 22 
#end cow 
#begin dns2 
Host dns2 
    HostName 172.20.4.80 
    User root 
    Port 22 
#end dns2 
#begin dns1 
Host dns1 
    HostName 172.20.4.75 
    User root 
    Port 22 
#end dns1 
#begin dns3 
Host dns3 
     HostName 172.20.4.76 
     User root 
     Port 22 
#end dns3 
#begin dns4 
Host dns4 
     HostName 172.20.4.77 
     User root 
     Port 22 
#end dns4 
#begin dns5 
Host dns5 
     HostName 172.20.4.78 
     User root 
     Port 22 
#end dns5 
#begin dns6 
Host dns6 
     HostName 172.20.4.79 
     User root 
     Port 22 
#end dns6 

分析其輪流

Host: cow Hostname: 172.18.0.10 User: root Port: 22 
Host: dns2 Hostname: 172.20.4.80 User: root Port: 22 
Host: dns1 Hostname: 172.20.4.75 User: root Port: 22 
Host: dns3 Hostname: 172.20.4.76 User: root Port: 22 
Host: dns4 Hostname: 172.20.4.77 User: root Port: 22 
Host: dns5 Hostname: 172.20.4.78 User: root Port: 22 
Host: dns6 Hostname: 172.20.4.79 User: root Port: 22 

因爲你沒有提到你的awk命令的任何人可以幫我這個 謝謝

+0

你能更具體一點嗎?在你的標題中,你正在尋求一個使用shell編程的解決方案,但是你需要awk程序的幫助。此外,目前尚不清楚,您的問題到底在哪裏。首先我想,你有收集屬於一個主機的行的問題,但是你明確提到'rsplit'。你究竟需要知道什麼?如何在awk中實現'rsplit'?如果是的話,你使用的是awk(舊awk,gawk,....)? – user1934428

回答

2

基於文本(假設結構是否齊全(開始 - >結束),沒有空行,...)

awk -v "Sep=\t" '/^#begin/{Infos="";next}/^#end/{print Infos;next}{Infos = Infos ($1~/^Host$/ ? "" : Sep) $1 ": " $2}' YourFile 

Sep是信息子序列之間的分隔符。

同樣的,一個過濾器(僅當過濾器是一樣的打印;在這裏,如果主機是男孩

awk -v "Sep=\t" -v"Filter=^cow$|^boy$" ' 
    /^#begin/{Infos="";PassFilter=0;next} 
    /^#end/&&PassFilter{print Infos;next} 
    $1~/^Host$/{PassFilter=$2~Filter} 
    {Infos = Infos ($1~/^Host$/ ? "" : Sep) $1 ": " $2} 
    ' YourFile 

說明:

  • /^#begin/{Infos="";next}復位字符串打印由#begin開始的每一行,轉到源文件的下一行(不要看下面的指令)。
  • /^#end/&&PassFilter{print Infos;next}當行以#end開頭且變量PassFilter爲真(= 1)時,打印字符串內容Infos,轉到源文件的下一行。
  • $1~/^Host$/{PassFilter=$2~Filter}當線第一個字是Host,可變PassFilter是如果第二個字包含/對應於該正則表達式到Filter變量(^cow$|^boy$在這種情況下)設置爲真。當前行(第一($1)然後:和最後第二個字中的事實)到可變Infos
  • {Infos = Infos ($1~/^Host$/ ? "" : Sep) $1 ": " $2}添加內容與隔板if not line with Host`作爲第一個字。
+0

謝謝它非常有幫助但我如何控制參數 –

+0

之間的選項卡如果我想打印這個文件只有一個塊,如牛什麼awk命令我可以使用? –

+0

您需要在塊上添加過濾器。在這種結構中,如果在印刷之前最好2選擇,過濾塊或塊中。我在塊內顯示示例(容易適應) – NeronLeVelu

5

後問題,我假設你正在尋找解決方案awk和解釋。

AMD$ awk '!/^#/{printf $1": "$2" "}/end/{print '\n'}' File 

Host: cow HostName: 172.18.0.10 User: root Port: 22 
Host: dns2 HostName: 172.20.4.80 User: root Port: 22 
Host: dns1 HostName: 172.20.4.75 User: root Port: 22 
Host: dns3 HostName: 172.20.4.76 User: root Port: 22 
Host: dns4 HostName: 172.20.4.77 User: root Port: 22 
Host: dns5 HostName: 172.20.4.78 User: root Port: 22 
Host: dns6 HostName: 172.20.4.79 User: root Port: 22 

對於#!/^#/)開始的所有行NOT,printf的所述1st2nd字段由:space分隔。繼續直到我們點擊end模式(/end/),我們將打印新行。

如果您正在尋找您已有的awk命令的解釋,請在問題中提及它。

+0

非常感謝你幫助我,如果我想打印這個文件只有一個塊,如牛,我可以使用什麼awk命令? –

+0

Arash Shams:awk'/#begin cow/{v = 1}!/ ^#/ && v {printf $ 1「:」$ 2「」}/end/&& v {print'\ n'; v = 0}'文件。如果有幫助,你可以放棄並接受答案。 –

+0

我決定刪除#begin和#end,所以我如何更改命令從主機開始解析並結束到另一個主機的開始意味着像主機dns2主機名172.20.4.80用戶根端口22 –