列出大于X值且小于Y

时间:2018-12-20 19:21:48

标签: bash shell unix

我在UNIX服务器上有一些文件,它们的名称类似于abc_ 250 -00.txt。 现在,我要列出大于X但小于Y的文件。

例如:- 下面是文件列表

abc_**100**-00.txt
xyz_**101**-000.txt
abc_**200**-00.txt
xyz_**201**-000.txt
abc_**250**-00.txt
xyz_**290**-000.txt
abc_**300**-00.txt
xyz_**350**-000.txt

我需要大于XXX_ 201 -xx.txt但小于XXX_ 300 -xx.txt的文件列表的结果。

abc_ 250 -00.txt

xyz_ 290 -000.txt

我尝试过ls并与awk结合使用,但是我没有得到正确的结果。

非常感谢您的帮助。谢谢!

3 个答案:

答案 0 :(得分:1)

awk来营救!

$ ls *.txt | awk -F[-_] '201<$2 && $2<300'

abc_250-00.txt
xyz_290-000.txt

如果您不想包含其他文件,则可以将ls限制为ls *_[0-9][0-9][0-9]-00*.txt

答案 1 :(得分:0)

不需要子shell。

echo "abc_100-00.txt
xyz_101-000.txt
abc_200-00.txt
xyz_201-000.txt
abc_250-00.txt
xyz_290-000.txt
abc_300-00.txt
xyz_350-000.txt" |
while read -f f
do n=${f#???_}
   n=${n%-*} 
   if (( n < 300 )) && (( n > 201 )) 
   then echo $f
   fi
done

不过,awk可能会更快。 :)

答案 2 :(得分:0)

给出:

$ ls -1
abc_**100**-00.txt
abc_**200**-00.txt
abc_**250**-00.txt
abc_**300**-00.txt
xyz_**101**-000.txt
xyz_**201**-000.txt
xyz_**290**-000.txt
xyz_**350**-000.txt

您可以使用Perl:

$ ls -1 | perl -lnE 'say if (m/(?<=\*)(\d{3})(?=\*)/ && 201<$1 && $1<300)'
abc_**250**-00.txt
xyz_**290**-000.txt