2013-01-07 57 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