【发布时间】:2011-01-25 23:59:51
【问题描述】:
我有一个文件,我想在其中查找以 -rwx 或 drwx 开头并以任意数字结尾的行。
我有这个,但它不太正确。有什么想法吗?
grep [^.rwx]*[0-9] usrLog.txt
【问题讨论】:
标签: grep
我有一个文件,我想在其中查找以 -rwx 或 drwx 开头并以任意数字结尾的行。
我有这个,但它不太正确。有什么想法吗?
grep [^.rwx]*[0-9] usrLog.txt
【问题讨论】:
标签: grep
棘手的部分是一个正则表达式,它包含一个破折号作为字符类中的有效字符之一。破折号必须在(正常)字符类的开始之后立即出现,并且在否定字符类的插入符号之后必须立即出现。如果你也需要一个右方括号,那么你需要一个右方括号,然后是破折号。幸运的是,您只需要破折号,因此选择了符号。
grep '^[-d]rwx.*[0-9]$' "$@"
有关 POSIX 标准的详细信息,请参阅:Regular Expressions 和 grep。
【讨论】:
grep -x '[-d]rwx.*[0-9]'。
-x 是 POSIX。破折号后面的括号:[[.-.][.].]](当然,它的可读性低于[]-])。我相信这也是POSIX…
看起来你走对了……^ 字符匹配行首,$ 匹配行尾。乔纳森的模式对你有用......只是想给你背后的解释
【讨论】:
[ ] 字符类中的字符的行为与正则表达式其他部分中的行为明显不同。
应该注意,插入符号 (^) 不仅在括号内的行为不同,而且将它放在括号外也会产生相反的结果。将插入符号放在您拥有的位置将搜索所有不以您放置在括号内的内容开头的字符串。您还希望在括号之间的星号前放置一个句点,就像使用 grep 一样,它也充当“通配符”。
grep ^[.rwx].*[0-9]$
这应该对你有用,我注意到一些海报在他们的表达中使用了一个字符类,这也是一种有效的方法,但是你没有在你的原始表达中使用任何,所以我试图让一个接近你的尽可能解释沿途的每一个细微变化,以便更好地理解。否则我们如何学习?
【讨论】:
你可能想要 egrep。试试:
egrep '^[d-]rwx.*[0-9]$' usrLog.txt
【讨论】:
你在解析ls -l的输出吗?
如果你是,并且你只想获取文件名
find . -iname "*[0-9]"
如果您别无选择,因为 usrLog.txt 是由某物/其他人创建的,您绝对必须使用此文件,其他选项包括
awk '/^[-d].*[0-9]$/' file
Ruby(1.9+)
ruby -ne 'print if /^[-d].*[0-9]$/' file
重击
while read -r line ; do case $line in [-d]*[0-9] ) echo $line; esac; done < file
【讨论】:
为这个问题提供了许多答案。只是想再添加一个使用 bashism-
#! /bin/bash
while read -r || [[ -n "$REPLY" ]]; do
[[ "$REPLY" =~ ^(-rwx|drwx).*[[:digit:]]+$ ]] && echo "Got one -> $REPLY"
done <"$1"
@kurumi 回答 bash,它的用例也是正确的,但如果末尾没有换行符序列,它将不会读取文件的最后一行(只需保存文件而不在最后一行按“Enter/Return”) .
【讨论】: