我正在尝试从一个非常大的文件中收集文件名,具体取决于是否找到了特定用户{@ 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
-----------------------
有人可以考虑如何获得预期的结果吗?
答案 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)
尝试使用awk。您可以使用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
但很容易安装。