如果找到,如何根据模式获取特定行

时间:2013-12-14 21:42:46

标签: sed awk

我正在尝试从一个非常大的文件中收集文件名,具体取决于是否找到了特定用户{@ 1}}。

我尝试过运行windowsdom\nasarchive,但它没有带来任何东西。

sed -nr "/-{3,}/h; /Path\s*:/H; /windowsdom\\nasarchive\s+Allow\s+FullControl/{x;G;p}" logfilename

预期结果:

-----------------------
Path: U:\Credit share\BI-WEEKLY CREDIT NOTES\2010\Credit status - April 21 - 2.doc


AccessToString : windowsdom\nasarchive Allow  FullControl
                 BUILTIN\Administrators Allow  FullControl
                 NT AUTHORITY\SYSTEM Allow  FullControl
                 BUILTIN\Users Allow  ReadAndExecute, Synchronize

-----------------------
Path: U:\Credit share\BI-WEEKLY CREDIT NOTES\2009\Credit status - Sept. 23 - 59.doc


AccessToString : windowsdom\acl_1 Allow  ReadAndExecute, Synchronize
                 windowsdom\acl_2 Allow  Modify, Synchronize
                 windowsdom\acl_3 Allow  ReadAndExecute, Synchronize
                 windowsdom\adm_server Allow  Modify, Synchronize
                 BUILTIN\Administrators Allow  FullControl


-----------------------
Path: U:\Credit share\BI-WEEKLY CREDIT NOTES\2010\Credit status - August 10 - 3.doc


AccessToString : windowsdom\nasarchive Allow  FullControl
                 BUILTIN\Administrators Allow  FullControl
                 NT AUTHORITY\SYSTEM Allow  FullControl
                 BUILTIN\Users Allow  ReadAndExecute, Synchronize



-----------------------

有人可以考虑如何获得预期的结果吗?

4 个答案:

答案 0 :(得分:3)

编辑:我知道编辑已接受的答案并不是最好的主意,但这实际上是不准确的。事实证明,保持空间保留在线之间。

您的命令的主要问题是您使用双引号,因此sed看不到转义的反斜杠。将它们更改为单引号并开始工作:

$ sed -nr '/-{3,}/h; /Path\s*:/H; /windowsdom\\nasarchive\s+Allow\s+FullControl/{x;G;p}' file
-----------------------
Path: U:\Credit share\BI-WEEKLY CREDIT NOTES\2010\Credit status - April 21 - 2.doc
AccessToString : windowsdom\nasarchive Allow  FullControl
-----------------------
Path: U:\Credit share\BI-WEEKLY CREDIT NOTES\2010\Credit status - August 10 - 3.doc
AccessToString : windowsdom\nasarchive Allow  FullControl

现在,您可以简化它以匹配所需的输出。你最终会得到的是protong的answer

sed -rn '/^Path:/h;/windowsdom\\nasarchive\s+Allow\s+FullControl/{g;p}' file

POSIX替代方案:

$ sed --posix -n '/^Path:/h;/windowsdom\\nasarchive[[:space:]]\{1,\}Allow[[:space:]]\{1,\}FullControl/{g;p}' log.txt
Path: U:\Credit share\BI-WEEKLY CREDIT NOTES\2010\Credit status - April 21 - 2.doc
Path: U:\Credit share\BI-WEEKLY CREDIT NOTES\2010\Credit status - August 10 - 3.doc

答案 1 :(得分:3)

这可能适合你(GNU sed):

sed -rn '/^Path:/h;/windowsdom\\nasarchive\s+Allow\s+FullControl/{g;p}' file

这会在遇到所需字符串时打印最后一个Path字符串。

答案 2 :(得分:1)

尝试使用。您可以使用path保存每一行,并在找到第一个字段与AccessToString匹配且第三个字段与windowsdom\nasarchive匹配的行时将其打印出来:

awk '
    $1 ~ /^Path/ { path = $0; next } 
    $1 ~ /^AccessToString/ && $3 ~ /^windowsdom\\nasarchive$/ { print path }
' infile

它产生;:

Path: U:\Credit share\BI-WEEKLY CREDIT NOTES\2010\Credit status - April 21 - 2.doc
Path: U:\Credit share\BI-WEEKLY CREDIT NOTES\2010\Credit status - August 10 - 3.doc

答案 3 :(得分:1)

如果您有gawk 1 ,则可以通过设置{{1}将记录定义为带有RS="-----------------------"的短划线和每个字段之间的文本。 }:

FS="\n"

打印:

gawk '
   BEGIN {RS="-----------------------"; FS="\n"} 
   $5 ~ /windowsdom\\nasarchive\s+Allow\s+FullControl/ {print $2;}
' ur_file.txt

1 要查找awk的版本,请使用Path: U:\Credit share\BI-WEEKLY CREDIT NOTES\2010\Credit status - April 21 - 2.doc Path: U:\Credit share\BI-WEEKLY CREDIT NOTES\2010\Credit status - August 10 - 3.doc 。 Linux通常使用awk --version并将其链接到gawk。 OS X没有awk但很容易安装。