2013-01-07 60 views
1

類似的話,我有一個包含一些值示例文本文件abc.txt的bash:從搜索文本文件

Harry Potter - A:JK:1:1:1 
Harry Potter - B:JK:1:1:1 
Hairy Potter - C:Harry:1:1:1 

:是值之間的分隔符。目前,我正在嘗試grep類似的值,並與第一列進行比較並打印出行。

grep -i "harry" BookDB.txt | awk -F ':' '{print $0}' 

它產生:

Harry Potter - A:JK:1:1:1 
Harry Potter - B:JK:1:1:1 
Hairy Potter - C:Harry:1:1:1 

不過,我想達到的結果是:

Harry Potter - A:JK:1:1:1 
Harry Potter - B:JK:1:1:1 

任何幫助嗎?

回答

-2

如果你只是在第一個參數尋找Harry命令下面會做的伎倆

grep -i "harry " BookDB.txt | awk -F ':' '{print $0}'

但是如果你需要一個完整的書的名字,你必須編寫一個bash腳本,將提取的書名稱並將其與您的輸入進行比較。

+1

這與OP已經有什麼不同,通過'awk -F'管道任何東西:''{print $ 0}''什麼都不做,因爲它只是打印行。 –

0

所以你希望它只在該行的第一部分grep,在第一次出現「:」分隔符之前?

假設您確定文件中沒有「%」: 1)您用未使用的字符(%或另一個字符)代替「:」的第一次(且僅第一次)出現並顯示行可以說之前%的字符串

sed -e 's/:/%/' < BookDB.txt | grep -i '^[^%]*harry[^%]*%' 

,或者如果所有行包含 「 - 」:簡化爲這樣:

sed -e 's/:/%/' < BookDB.txt | grep -i '^[^%]*harry' 

,並加入到這個

| sed -e 's/%/:/' # to restore the original line 

在上面的例子中,你可以用「 - 」(多字符分隔符)替換「:」,它仍然可以工作。

如果你真的需要,只是爲了找到一個字符中第一次出現之前的東西,你可以進一步簡化爲這樣的(但它的彈性較差):

grep -i '^[^:]*harry[^:]*:' 

grep -i '^[^:]*harry' 

(第二個應該只能用於如果所有行都與您需要匹配的東西類似的格式)

+0

並驗證您沒有任何「未使用的字符」:'grep'%'BookDB.txt ||回聲「確定,沒有找到它」。「 –

+0

」在bash上:ctrl + v後面跟着例如ctrl + e,將插入一個「^ E」特殊字符,它不太可能在B​​ookDB.txt中完全複製。用「ctrl + v ctrl + e」替換上面的所有「%」。爲了便於操作(即易於複製/粘貼),定義:'export unusedchar =「$(printf'\ 005')」'。然後將上面的行更改爲:'sed -e's/- /'$ {unusedchar}'/'

+0

嗯......我試圖在第一個「:」不是「 - 」之前對部件進行grep。 – wjs

2

所有awk -F ':' '{print $0}'確實是打印每一個嗯,它在你的例子中什麼都不做。

如果你想與awk做到這一點的是:

$ awk -F: '$1~/Harry/' file 
Harry Potter - A:JK:1:1:1 
Harry Potter - B:JK:1:1:1 

# Case insensitive 
$ awk -F: 'tolower($1)~/harry/' file 
Harry Potter - A:JK:1:1:1 
Harry Potter - B:JK:1:1:1 

僅打印,如果第一場$1比賽/Harry/,不區分大小寫的版本的第一場全部轉換爲小寫字符和檢查線反對/harry/

如果你知道情況總是如此,你可以將harry作爲^的開始位置?

$ grep -i "^harry" file 
Harry Potter - A:JK:1:1:1 
Harry Potter - B:JK:1:1:1 
+0

+1這絕對是解決這個問題的方法。 – tripleee