2012-06-01 59 views
-1

我習慣vi而不是vim。對於我的工作,我正在嘗試使用ksh和vi來創建腳本。我想要做的是能夠打開並搜索文件中的關鍵術語並提取信息。例如,我想運行一個ksh腳本,該腳本搜索文件中的關鍵術語「主題」,然後提取「第一行」信息。我想使用vi的原因是因爲我然後想寫一個文件來將我提取的值寫入由逗號分隔的一行中。Ksh和Vi腳本

Subject: line one 
Content: line two 

謝謝任何​​幫助和參考。

編輯:是的,使用sed,awk和grep是更有效的方法。但我有分配我的結果在ksh的一個變量的一個問題,目前我有:

testing=grep Primary /u/mtjandr/temp.txt | sed -e 's/[:a-zA-Z]* //g' 
grep Primary /u/mtjandr/temp.txt | sed -e 's/[:a-zA-Z]* //g' 

它本身。OUPUTS正確的結果,但是當我嘗試將其分配給一個變量,我得到erorr

copy_group.sh [18]:主要:未找到。

更新:我發現我的解決方案:

testing=`grep Primary /u/mtjandr/temp.txt | sed -e 's/[:a-zA-Z]* //g'` 
+3

我還是不明白,爲什麼你必須使用'六。還有許多其他更簡單的方法來實現使用工具,專門爲此目的而設計的,例如'sed','awk','grep'。 –

+1

......另外,爲了提高您獲得合理答案的機會,您可能還需要包括一個*期望輸出的例子*和[您已經嘗試過](http://whathaveyoutried.com)的描述。 –

回答

1

鑑於您的文件可能看起來普通,你會想看看awkgrepsed肖恩提及。 Grep給你你感興趣的行,awk提取字段和sed編輯整個事情。

因此,在你的榜樣,你會希望找到包含Subject行:

grep Subject file 

,並提取line one

awk '{printf "%s %s,", $2, $3}' 

終於卸下插在文件的結尾額外,

sed 's/,$//' 

這三個命令需要將管道連接到一起:

grep Subject file | awk '{printf "%s %s,", $2, $3}' | sed -e 's/,$//' 

當然,awk部分需要進行定製,以您的確切文件結構。

最後,寫在另一個文件(而不是輸出)整個事情,你可以在命令的輸出重定向上面的文件:

grep Subject file | awk '{printf "%s %s,", $2, $3}' | sed -e 's/,$//' > other_file 
0

正如我上面的評論說,有很多實現使用工具的其他更簡單的方法就是爲了這個目的而設計的,例如sed,awkgrep

如果你決定給其他的東西比vi一展身手,那麼這裏就是使用單一awk命令版本:

awk '/^Subject: /{printf "%s%s",x,substr($0,10);x=","}' in.txt > out.txt 

例子:

[[email protected]]$ cat in.txt 
Subject: line one 
Content: line two 
Subject: line three 
yadda yadda 

[[email protected]]$ awk '/^Subject: /{printf "%s%s",x,substr($0,10);x=","}' in.txt > out.txt 
[[email protected]]$ cat out.txt 
line one,line three 

x=','位,所以我們可以用逗號前面的所有輸出與第一個輸出區分開來。對於更易讀的內容,我們可以簡單地將輸出記錄分隔符(ORS)從\n更改爲逗號。這個用戶將導致一個尾隨的逗號,我們需要用另一個命令刪除它。

在這個例子中,我們管道輸出到sed刪除尾隨分隔符:

awk -v ORS=',' '/^Subject: /{print substr($0,10)}' in.txt | sed -e 's/,$//' > out.txt 

命令的故障:

awk -v ORS=',' '/^Subject: /{print substr($0,10)}' in.txt | sed -e 's/,$//' > out.txt 
    _________ __________ ___________________ ______ _______________ _________ 
     |    |    |    |    |   | 
separate output  |   OUtput the line  |  Remove trailing | 
records with  |   from char 10   |   comma   | 
comma (not \n)  |    onwards   |       | 
        |        |     Redirect output 
      Match lines that     input file    to out.txt 
      start with "Subject :"