根据bash中的匹配模式复制行

时间:2014-07-23 18:52:09

标签: bash

我需要从文件中复制某些行,基本上是满足匹配的用户数据。例如,查看此部分文件:

    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 = 

希望这是有道理的,谢谢你。

3 个答案:

答案 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 =