好的,所以我希望保留包含多个关键字的行
列表示例:
Name:email:username #registered
Name2:email2:username2
Name3:email3:username3 #registered #subscribed #phonever
Name4:email4:username4 #unconfirmed
我想要做的是提取行,如果它们包含" #registered,#subscribed, 我想要的输出示例,Name:email:username #registered
Name3:email3:username3 #registered #subscribed #phonever
答案 0 :(得分:2)
使用awk
(使用正则表达式替换运算符,|
,在固定字符串列表中):
awk '/#registered|#subscribed|#phonever/' file
/.../
下的部分称为awk
pattern,对于匹配的行,它执行后面的操作(如{ ... }
)。但由于默认操作是:{ print $0 }
(打印完整的输入记录/行),因此无需在此处指定。
与sed
类似,您可以说:
sed -nE '/#registered|#subscribed|#phonever/p' file
但现在我们必须指定-n
默认跳过打印,并使用p
命令仅打印与模式匹配的行(称为sed
地址)。 -E
告诉sed
使用POSIX ERE(扩展正则表达式),我们在这里需要它,因为默认的POSIX BRE(基本正则表达式)没有定义交替运算符。
对于简单过滤(并打印与某些模式匹配的行),grep
也是一个选项(并且是一个非常快的选项):
grep '#registered\|#subscribed\|#phonever' file
awk
带有模式文件)更大(可能是动态)模式列表的解决方案可以是将所有模式保存在单独的文件中,例如patterns
:
#registered
#subscribed
#phonever
并使用此awk
程序:
awk 'NR==FNR { pat[$0]=1 } NR>FNR { for (p in pat) if ($0 ~ p) {print;next} }' patterns file
首先将所有模式加载到pat
数组中,然后尝试匹配file
中每条线上的任何模式,打印并前进到第一个匹配的下一行找到。
结果是一样的:
Name:email:username #registered
Name3:email3:username3 #registered #subscribed #phonever
但是现在脚本没有针对每组新模式进行更改。但请注意,这会降低性能损失(通常的解决方案通常会这样做)。对于较短的模式列表和较小的文件,这不应该是一个问题。
grep
具有固定字符串模式文件)基于上面的方法(保留一个固定字符串"模式列表"在文件中),我们实际上可以使用grep
- 它提供了一个专门的选项({{ 1}})用于从文件中获取模式,每行一个。为了进一步加快匹配速度,我们还应该使用-f FILE
/ -F
选项。
所以,这个:
--fixed-strings
将非常快,处理固定字符串模式的长列表和具有最小内存开销的大文件。
答案 1 :(得分:0)
简单 awk 方法:
awk '/#(registered|subscribed|phonever)/' file
输出:
Name:email:username #registered
Name3:email3:username3 #registered #subscribed #phonever
(registered|subscribed|phonever)
- regexp交替组,用于匹配几个可能的正则表达式中的单个正则表达式答案 2 :(得分:0)
$ cat tst.awk
NR==FNR {
strings[$0]
next
}
{
for (i=2; i<=NF; i++) {
if ($i in strings) {
print
next
}
}
}
$ awk -f tst.awk strings file
Name:email:username #registered
Name3:email3:username3 #registered #subscribed #phonever
$ cat strings
#registered
#subscribed
#phonever
$ cat file
Name:email:username #registered
Name2:email2:username2
Name3:email3:username3 #registered #subscribed #phonever
Name4:email4:username4 #unconfirmed
如果您的文件很大而且您的目标词组相对较小并且执行速度对您很重要,那么您可以这样做以生成这些目标词的每个可能的非空子集的所有可能组合:
$ cat subsets.awk
###################
# Calculate all subsets of a given set, see
# https://en.wikipedia.org/wiki/Power_set
function get_subset(A,subsetNr,numVals, str, sep) {
while (subsetNr) {
if (subsetNr%2 != 0) {
str = str sep A[numVals]
sep = " "
}
numVals--
subsetNr = int(subsetNr/2)
}
return str
}
function get_subsets(A,B, i,lgth) {
lgth = length(A)
for (i=1;i<2^lgth;i++) {
B[get_subset(A,i,lgth)]
}
}
###################
# Input should be a list of strings
{
split($0,A)
delete B
get_subsets(A,B)
for (subset in B) {
print subset
}
}
$ cat permutations.awk
###################
# Calculate all permutations of a set of strings, see
# https://en.wikipedia.org/wiki/Heap%27s_algorithm
function get_perm(A, i, lgth, sep, str) {
lgth = length(A)
for (i=1; i<=lgth; i++) {
str = str sep A[i]
sep = " "
}
return str
}
function swap(A, x, y, tmp) {
tmp = A[x]
A[x] = A[y]
A[y] = tmp
}
function generate(n, A, B, i) {
if (n == 1) {
B[get_perm(A)]
}
else {
for (i=1; i <= n; i++) {
generate(n - 1, A, B)
if ((n%2) == 0) {
swap(A, 1, n)
}
else {
swap(A, i, n)
}
}
}
}
function get_perms(A,B) {
generate(length(A), A, B)
}
###################
# Input should be a list of strings
{
split($0,A)
delete B
get_perms(A,B)
for (perm in B) {
print perm
}
}
$ echo '#registered #subscribed #phonever' |
awk -f subsets.awk |
awk -f permutations.awk
#registered #subscribed #phonever
#subscribed #phonever #registered
#phonever #subscribed #registered
#phonever #registered #subscribed
#subscribed #registered #phonever
#registered #phonever #subscribed
#phonever
#subscribed
#registered #subscribed
#subscribed #registered
#registered
#registered #phonever
#phonever #registered
#subscribed #phonever
#phonever #subscribed
然后你可以让其余的处理只是一个简单的哈希查找:
$ echo '#registered #subscribed #phonever' |
awk -f subsets.awk |
awk -f permutations.awk |
awk 'NR==FNR{strings[$0];next} {k=(NF>1?$0:"");sub(/[^ ]+ /,"",k)} k in strings' - file
Name:email:username #registered
Name3:email3:username3 #registered #subscribed #phonever