Grep的开头和结尾?

时间:2011-01-25 23:59:51

标签: regex linux bash grep

我有一个文件,我想要grep以-rwx或drwx开头的行以任何数字结尾。

我有这个,但它不是很正确。有什么想法吗?

grep [^.rwx]*[0-9] usrLog.txt

6 个答案:

答案 0 :(得分:54)

棘手的部分是一个正则表达式,它包含一个破折号作为角色类中的一个有效字符。短划线必须在(正常)字符类的开始之后立即出现,并且在插入对于否定字符类之后立即出现。如果您也需要一个紧密的方括号,那么您需要紧密的方括号,然后是短划线。幸运的是,你只需要破折号,因此选择了符号。

grep '^[-d]rwx.*[0-9]$' "$@"

有关POSIX标准的详细信息,请参阅:Regular Expressionsgrep

答案 1 :(得分:25)

看起来你走在正确的轨道上...... ^字符匹配行首,$匹配行尾。乔纳森的模式对你有用......只是想给你背后的解释

答案 2 :(得分:5)

应该注意的是,插入符号(^)不仅在括号内表现不同,而且将其置于括号之外也会产生相反的结果。将插入符号放在您拥有它的位置将搜索所有不以您放在括号内的内容开头的字符串。您还希望在括号之间放置一个句点,如同grep一样,它也可以充当“通配符”。

grep ^[.rwx].*[0-9]$

这应该适合你,我注意到一些海报在他们的表达式中使用了一个字符类,这也是一种有效的方法,但是你没有在你的原始表达中使用任何一个,所以我试图让你的一个接近你的尽可能地解释沿途的每一个微小变化,以便更好地理解。我们怎么能以其他方式学习?

答案 3 :(得分:3)

你可能想要egrep。尝试:

egrep '^[d-]rwx.*[0-9]$' usrLog.txt

答案 4 :(得分:1)

你正在解析ls -l的输出吗?

如果您是,并且您只想获取文件名

find . -iname "*[0-9]" 

如果您别无选择,因为usrLog.txt是由某人/某人创建的,您绝对必须使用此文件,其他选项包括

awk '/^[-d].*[0-9]$/' file

红宝石(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

答案 5 :(得分:0)

为此问题提供了许多答案。只想再添加一个使用bashism-

#! /bin/bash
while read -r || [[ -n "$REPLY" ]]; do
[[ "$REPLY" =~ ^(-rwx|drwx).*[[:digit:]]+$ ]] && echo "Got one -> $REPLY"
done <"$1"
bash的

@kurumi答案,使用大小写也是正确的,但是如果末尾没有换行符,它将不读取文件的最后一行(只需保存文件而无需在最后一行按Enter / Return键)