grep 没有提取所需的字符串
grep not extracting desired string
我正在为我的 class(在 Unix 中)解决以下问题,我 运行 遇到了一些问题。
Using the grep
command and regular expressions, create a pipe-based
chain of commands that will list all files in the default directory
that others can read or write.
这是我目前使用的命令,它将正确匹配正确的行,但我只想打印具有所需权限的文件的名称。
ls -la | grep "^.......rw.*:\d\d\s(.*)$"
这里是我输入 ls -la
的结果 "greping"
total 344
drwxr-xr-x 10 cameronpattisall staff 340 Apr 7 11:21 .
drwxr-xr-x 7 cameronpattisall staff 238 Apr 7 11:22 ..
-rw-r--r-- 1 cameronpattisall staff 6148 Apr 7 11:21 .DS_Store
-rw-r--r-- 1 cameronpattisall staff 11591 Apr 7 11:21 DifferencesToTagged.txt
-rw-r--r-- 1 cameronpattisall staff 4291 Apr 7 11:21 functions.py
-rw-r--r-- 1 cameronpattisall staff 6080 Apr 7 11:21 ls.txt
-rw-r--r-- 1 cameronpattisall staff 5511 Apr 7 11:21 prog4.py
-rw-r--r-- 1 cameronpattisall staff 345 Apr 7 11:21 shared.py
-rw-r--r-- 1 cameronpattisall staff 1832 Apr 7 11:21 subversion-log.txt
-rw-r--r-- 1 cameronpattisall staff 122295 Apr 7 11:21 testcases.txt
我猜解决方案是使用:
grep -E "^-.{6}(r|.w)"
第一列的结构是“-/d”(file/dir)+xxx
(所有者)+xxx
(组)+xxx
(其他).
所以你想匹配那些以 -
(文件)开头并包含在“gorup”部分的 r..
或 .w.
.
要仅打印文件名,则可以通过管道传输到 grep -o '[^ ]*$'
。这将打印最后一个文本块。请注意,这是非常脆弱的,因为在带有空格的文件名中,它只会打印最后一个。
测试
我将你的 ls -la
存储在文件 a
中:
$ grep -E "^-.{6}(r|.w)" a | grep -o '[^ ]*$'
.DS_Store
DifferencesToTagged.txt
functions.py
ls.txt
prog4.py
shared.py
subversion-log.txt
testcases.txt
如果您已经匹配了正确的行,您可以附加类似
的内容
| tr -s ' ' | cut -d ' ' -f 9-
到您的管道。
tr -s ' '
将多个连续的 space 替换为单个 space; cut
命令从每行中删除除第九个字段以外的所有内容,字段由单个 space 个字符分隔。
我正在为我的 class(在 Unix 中)解决以下问题,我 运行 遇到了一些问题。
Using the
grep
command and regular expressions, create a pipe-based chain of commands that will list all files in the default directory that others can read or write.
这是我目前使用的命令,它将正确匹配正确的行,但我只想打印具有所需权限的文件的名称。
ls -la | grep "^.......rw.*:\d\d\s(.*)$"
这里是我输入 ls -la
的结果 "greping"
total 344
drwxr-xr-x 10 cameronpattisall staff 340 Apr 7 11:21 .
drwxr-xr-x 7 cameronpattisall staff 238 Apr 7 11:22 ..
-rw-r--r-- 1 cameronpattisall staff 6148 Apr 7 11:21 .DS_Store
-rw-r--r-- 1 cameronpattisall staff 11591 Apr 7 11:21 DifferencesToTagged.txt
-rw-r--r-- 1 cameronpattisall staff 4291 Apr 7 11:21 functions.py
-rw-r--r-- 1 cameronpattisall staff 6080 Apr 7 11:21 ls.txt
-rw-r--r-- 1 cameronpattisall staff 5511 Apr 7 11:21 prog4.py
-rw-r--r-- 1 cameronpattisall staff 345 Apr 7 11:21 shared.py
-rw-r--r-- 1 cameronpattisall staff 1832 Apr 7 11:21 subversion-log.txt
-rw-r--r-- 1 cameronpattisall staff 122295 Apr 7 11:21 testcases.txt
我猜解决方案是使用:
grep -E "^-.{6}(r|.w)"
第一列的结构是“-/d”(file/dir)+xxx
(所有者)+xxx
(组)+xxx
(其他).
所以你想匹配那些以 -
(文件)开头并包含在“gorup”部分的 r..
或 .w.
.
要仅打印文件名,则可以通过管道传输到 grep -o '[^ ]*$'
。这将打印最后一个文本块。请注意,这是非常脆弱的,因为在带有空格的文件名中,它只会打印最后一个。
测试
我将你的 ls -la
存储在文件 a
中:
$ grep -E "^-.{6}(r|.w)" a | grep -o '[^ ]*$'
.DS_Store
DifferencesToTagged.txt
functions.py
ls.txt
prog4.py
shared.py
subversion-log.txt
testcases.txt
如果您已经匹配了正确的行,您可以附加类似
的内容| tr -s ' ' | cut -d ' ' -f 9-
到您的管道。
tr -s ' '
将多个连续的 space 替换为单个 space; cut
命令从每行中删除除第九个字段以外的所有内容,字段由单个 space 个字符分隔。