1

我有一个abc.txt包含一些值的示例文本文件:

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

有什么帮助吗?

4

3 回答 3

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
于 2013-01-07T15:57:06.407 回答
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'

(仅当所有行的格式与您需要匹配的行的格式相似时才应该使用第二个)

于 2013-01-07T15:43:07.723 回答
-2

如果您只是Harry在第一个参数中查找,则下面的命令可以解决问题

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

但是,如果您需要完整的书名,则必须编写一个 bash 脚本,该脚本将提取书名并将其与您的输入进行比较。

于 2013-01-07T15:41:51.140 回答