我正在编写 shell 脚本并遇到一个问题。如果我有一个包含目录和文件信息列表的文件,例如:
home/svdev/src/lib
home/dev/project/doc
home/server/etc
dev.dump/trunk/src
dev.dump/src/etc
etc/hosts
template.txt
admin/releases/tables
我想确定是否有任何目录或文件不以家和开发转储。因此,对于给定的数据,由于最后三个条目与目录条件匹配,所以我应该得到错误的作为我的输出
答案1
您可以grep
为此使用:
$ cat good
home/svdev/src/lib
home/dev/project/doc
home/server/etc
dev.dump/trunk/src
dev.dump/src/etc
$
$ cat bad
home/svdev/src/lib
home/dev/project/doc
home/server/etc
dev.dump/trunk/src
dev.dump/src/etc
etc/hosts
template.txt
admin/releases/tables
$
$ if grep -q -v -E '^home/|^dev\.dump/|^[[:space:]]*$' good; then echo false; else echo true; fi
true
$ if grep -q -v -E '^home/|^dev\.dump/|^[[:space:]]*$' bad; then echo false; else echo true; fi
false
对于grep
我使用的^home/|^dev\.dump/|^[[:space:]]*$
,这意味着“搜索^
以 home/ 开头 ( ) 或以 dev.dump/|
开头 ( ) 的行”或可以选择包含空格字符 ( ) 的空白行。该选项导致将模式应用为扩展正则表达式。该选项反转匹配,因此它匹配与模式不匹配的行。 “好”文件将没有与反转模式匹配的行,“坏”文件将有行。该选项会导致抑制输出。^
|
^[[:space:]]*$
-E
grep
-v
-q
grep
如果grep
找到匹配,则以 0 退出;如果没有匹配,它将以非零值退出。我使用 shellif
检查grep
的退出值,并相应地打印相应的true
/false
字符串。
答案2
您可以尝试使用grep(1)
和if-statement
if grep -Evq '^(home|dev\.dump).*' file.txt ; then echo false; fi