我的硬盘中有大量 ISO 映像,并且我将其全部内容列在以下格式的文本文件中:
<immage>.iso, <dir structure>/<filename>.<extension>
例子:
OS Backups.iso, ubuntu-12.04-desktop-i386.iso
OS Backups.iso, xubuntu-12.04-desktop-i386.iso
OS Backups.iso, background/pictures.jpg
Pictures vacation 2011.iso, documents/cost_estimates.xls
Pictures vacation 2011.iso, italy/img1.jpg
Pictures vacation 2011.iso, italy/img2.jpg
现在我想针对该文本文件发出 grep 命令来查找名称中包含“图片”的文件。预期结果将是(对于上一个示例):
Pictures vacation 2011.iso
OS Backups.iso, background/pictures.jpg
关于如何使用 grep 完成这样的事情,您有什么想法吗?有其他选择吗?谢谢!
答案1
以下是如何使用grep,使用 Perl 正则表达式语法-P
,以及仅返回匹配部分转变-o
:
grep -Poi "(.*pictures.*\.iso.*pictures.*|.*pictures.*\.iso|.*pictures.*)" | sort | uniq
返回:
OS Backups.iso,背景/图片.jpg 图片假期2011.iso
- 对于每一行,
grep
首先检查它是否是.iso
名称中带有“图片”的文件,其中还包含名称中带有“图片”的文件,例如:图片假期 2011.iso,意大利/图片5.jpg
- 如果找到,它会打印该行并继续;如果没有找到,它会检查这是否是一个
.iso
名称中带有“图片”的文件; - 如果是,它就只打印 ISO 名称;如果不是,它会检查此行是否包含名称中带有“图片”的文件……
答案2
$ awk -F ", " 'BEGIN { IGNORECASE=1 } $1 ~ /pictures/ { print $1 ; next } $2 ~ /pictures/ { print }' < context.txt | sort | uniq
OS Backups.iso, background/pictures.jpg
Pictures vacation 2011.iso
答案3
#!/usr/bin/env python
import re, sys
a_file = sys.argv[1]
a_string = sys.argv[2]
#from http://www.peterbe.com/plog/uniqifiers-benchmark
def uniquify(seq, idfun=None):
# order preserving
if idfun is None:
def idfun(x): return x
seen = {}
result = []
for item in seq:
marker = idfun(item)
# in old Python versions:
# if seen.has_key(marker)
# but in new ones:
if marker in seen: continue
seen[marker] = 1
result.append(item)
return result
mylist = []
with open(a_file, 'r') as items:
for line in items.readlines():
if (re.search(a_string, line, re.IGNORECASE)):
temp = line.split(',',1)
if (re.search(a_string, temp[0], re.IGNORECASE)):
mylist.append(temp[0])
else:
mylist.append(line.rstrip())
mylist = uniquify(mylist)
for item in mylist:
print(item)
运行时产生所需的输出python test.py index.txt pictures
答案4
import fileinput
import sys
lookFor = sys.argv[1]
for line in fileinput.input("textfile.txt"):
if lookFor in line:
print line
您可以使用以下命令运行此脚本python scriptName.py WORDTOLOOKFOR
,例如,如果我想检查文本文件中是否包含单词“ubuntu”,并且脚本名为 script.py,我编写以下命令
python script.py ubuntu
确保重命名脚本中的文本文件。
编辑:这只会打印包含它的行,不会将其存储在任何地方,就像 grep 可以做的一样。