我有一个示例文本文件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
任何帮助?
答案 0 :(得分: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
答案 1 :(得分: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'
(第二个应该只在所有行的格式与你需要匹配的格式相似时才使用)
答案 2 :(得分:-2)
如果您只是在第一个参数中查找Harry
,则下面的命令将执行此操作
grep -i "harry " BookDB.txt | awk -F ':' '{print $0}'
但是,如果您需要完整的图书名称,则必须编写一个bash脚本,该脚本将提取图书名称并将其与您的输入进行比较。