Grep用于行的开始和结束?


67

我有一个文件要在其中以-rwx或drwx开头并以任何数字结尾的行进行grep。

我已经知道了,但这并不完全正确。有任何想法吗?

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

Answers:


58

棘手的部分是一个正则表达式,其中包括破折号作为字符类中的有效字符之一。对于(正常)字符类,破折号必须紧接在开始之后,而对于否定字符类,破折号必须紧接在插入号之后。如果您也需要一个封闭的方括号,那么您需要一个封闭的方括号,后跟破折号。幸运的是,您只需要破折号即可,因此选择了一种符号。

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

有关POSIX标准的详细信息,请参见:正则表达式grep


2
或者grep -x '[-d]rwx.*[0-9]'
短暂的2011年

在Linux上,是-或使用GNU grep的地方。我引用的版本适用于所有Unix变体,我将提交它以使其更好。
乔纳森·莱夫勒

2
-x是POSIX。方括号后面的破折号:(当然[[.-.][.].]],其可读性低于[]-])。我相信这也是POSIX…
短暂的

1
@ephemient:哦,是的,'grep -x'在POSIX中使用了很长时间-2008、2004、1997(SUS)。我的坏...我从来没有费心寻找这样的选项,因为'^ .... $'完全是例行程序,并且比单独的-x选项少使用一个字符。
乔纳森·莱夫勒

30

看起来您在正确的轨道上...^字符匹配行首,并且$匹配行尾。乔纳森(Jonathan)的模式将为您服务...只是想给您背后的解释


4
不过,这并不完全正确。值得注意的是,[ ]字符类中的字符的行为与正则表达式其他部分中的行为大不相同。
短暂的2011年

6

应当注意,插入号(^)在括号内的行为不仅会有所不同,而且将其置于括号外的效果也相反。将插入符号放在您要插入的位置,将搜索所有不以放在括号内的内容开头的字符串。您也希望像grep一样在方括号之间的星号前放置一个句点,它也可以用作“通配符”。

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

这应该对您有用,我注意到有些发布者在其表达式中也使用了字符类,这也是一种有效的方法,但是您在原始表达式中没有使用任何字符类,因此我尝试尽可能地接近您的解释沿途的每一个细微变化都可以更好地理解。否则我们如何学习?


3

您可能需要egrep。尝试:

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

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

0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.