如何在AWK命令中添加多个搜索


10

我试图搜索在六月,七月和八月创建的文件。我用这种方法

ls -lrth|awk '/[Jun][Jul][Aug]/ {print}'

但它不起作用。


1
为了便于记录,该[...]构造匹配一个字符,该字符可以是方括号之间的任何字符。因此,您的表达式匹配JJAJug((Jfrom [Jun]ufrom [Jul]gfrom [Aug]),但不匹配您希望匹配的月份缩写。
2015年

Answers:


12

您可以像这样匹配多种模式:

awk '/Jun/ || /July/ || /Aug/' <(ls -lrh)

这将返回6月,7月或8月的所有匹配项。您不需要该print语句,因为这是awk默认操作。


1
awk理解扩展的正则表达式,因此对于这样一个简单的模式,您可以将其写为awk '/Jun|Jul|Aug/'awk '/Ju[nl]|Aug/'
cas

5

通常,解析ls的输出是一个非常糟糕的主意。做你想要的更好的方法是

stat -c "%n %y" * | grep 2013-0[678]

或者,仅检查最后一个字段,以防止文件名本身是日期的可能性很小:

stat -c "%n %y" *| awk '$NF ~ /2013-0[678]/' 

来自man stat

   -c  --format=FORMAT
          use the specified FORMAT instead of the default; output  a  new
          line after each use of FORMAT

   %y     time of last modification, human-readable
   %n     file name

这也是一个很好的例子。我以前从未检查过STAT。感谢您提供的好信息
OmiPenguin

也许更改为... | awk '$NF ~ /2013-0[678]/'以仅检查最后一个输出字段,即使文件与日期不匹配,即使文件与正则表达式都匹配(不太可能?)。
2015年

3

ls是用于以人类可读的方式显示有关文件信息的命令。不要在脚本中使用它

在目录树中查找符合特定条件的文件的命令是find。如果您有GNU查找(即非嵌入式Linux或Cygwin)或FreeBSD查找(即FreeBSD或OSX),则可以-newermt用来匹配在某个日期之后最后修改的文件。

find . -newermt '1 June' ! -newermt '1 September' -print

如果要匹配特定年份中的文件,请添加年份,而不是脚本运行时的日历年。

如果您的find实现没有-newermt,则必须使用-newer,它会将find找到的文件的日期与固定文件进行比较。用于touch创建具有要用作边界的日期的临时文件。

dir=$(mktemp -d)
touch -d 201306010000 "$dir/from"
touch -d 201309010000 "$dir/to"
find . -newer "$dir/from" ! -newer "$dir/to" -print
rm -r "$dir"
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.