我需要从文件中复制某些行,基本上是满足匹配的用户数据。例如,查看此部分文件:
user0:
password = passw0rd
lastupdate = 1205877833
flags =
user1:
password = *
lastupdate = 1205877833
flags =
user2:
password = *
lastupdate = 1205877833
flags =
user3:
password = passw0rd
lastupdate = 1205877833
flags =
我想搜索某些字符串上的匹配项,例如“password = *”并打印用户条目(用空行分隔),
示例,搜索“password = *”的用户并将其打印出来,
SAMPLE OUTPUT:
user1:
password = *
lastupdate = 1205877833
flags =
user2:
password = *
lastupdate = 1205877833
flags =
希望这是有道理的,谢谢你。
答案 0 :(得分:2)
你可以用它。唯一的问题是你必须引用正则表达式模式。或者你可以根据需要使用正则表达式。
awk -v p='password = [*]' -v RS= -v ORS='\n\n' '$0 ~ p' file
这是一个正则表达形式,也不那么令人困惑:
awk -v RS= -v ORS='\n\n' '/password = [*]/' file
输出:
user1:
password = *
lastupdate = 1205877833
flags =
user2:
password = *
lastupdate = 1205877833
flags =
这里还有一个Ruby代码,你不需要引用它:
ruby -00 -e 'p = "password = *"; re = Regexp.new(Regexp.escape(p)); while gets; puts $_ if re =~ $_; end' file
它提供相同的输出。
答案 1 :(得分:0)
如果您的部分始终具有相同的结构(行数),则可以使用fgrep
:
更新:使用fgrep
的{{1}},否则会解释grep -F
。
*
免责声明:这种方法非常针对您的问题量身定制,每个部分的行数不一致会产生不连贯的结果。
请参阅explanation:
fgrep 'password = *' -B 1 -A 2 input.txt
:在匹配行前打印一行 -B 1
:在匹配-A 2
答案 2 :(得分:0)
您可以在Perl中使用正则表达式,如下所示:
perl -00 -ne '$p = "*"; print if /password\s*=\s*\Q$p\E/' file
-n
开关一次循环一个记录文件。 -0
开关指定输入记录分隔符。 -00
是一个特例,被称为"段模式"。在此模式下,每条记录都是一段文本,以一行或多行空行结束。这适用于您的文件,因为每个用户条目之间都有一个空行。
将变量$p
设置为您要匹配的密码。如果记录包含"密码= $p
" (中间有任意数量的空格)然后将打印该部分。
根据您的需要,您可能希望使正则表达式更严格一些(这将匹配"密码= *任何东西"但这个适用于您提供的样本。
输出:
user1:
password = *
lastupdate = 1205877833
flags =
user2:
password = *
lastupdate = 1205877833
flags =