Sed 如何根据找到的图案获得特定线条

Sed 如何根据找到的图案获得特定线条,sed,awk,Sed,Awk,我试图从一个非常大的文件中收集文件名,这取决于是否找到了特定的用户,在本例中是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\Credi

我试图从一个非常大的文件中收集文件名,这取决于是否找到了特定的用户,在本例中是
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



-----------------------
预期结果:

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 
有人能想到如何得到预期的结果吗?

试试看。您可以使用
路径保存每一行,并在找到第一个字段与
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

编辑:我知道编辑一个被接受的答案不是最好的主意,但它实际上是不准确的。结果表明,保持空间保留在两行之间

命令的主要问题是使用了双引号,因此转义的反斜杠被
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
现在,您可以简化它以匹配所需的输出。你最终会得到的是Proton的:

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
这可能适用于您(GNU-sed):


这将在遇到所需字符串时打印最后一个
路径
字符串。

如果您有
gawk
1,您可以通过设置
FS=“\n”
,将记录定义为破折号行之间的文本,并将每个字段设置为一行:

印刷品:

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要查找awk的版本,请使用
awk--version
。linux通常会有
gawk
,并将其链接到
awk
。OSX没有
gawk
,但安装起来很容易。

+1以获得合理的样本数据、预期输出和解决问题的尝试。祝你好运嘿,不幸的是,我不得不重写我的答案,所以你可能想检查一下你是否认为它应该被接受。@dawg当然,但OP使用的是GNU版本特有的功能。此外,还添加了与POSIX兼容的版本。
sed -rn '/^Path:/h;/windowsdom\\nasarchive\s+Allow\s+FullControl/{g;p}' file
gawk '
   BEGIN {RS="-----------------------"; FS="\n"} 
   $5 ~ /windowsdom\\nasarchive\s+Allow\s+FullControl/ {print $2;}
' ur_file.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