是否有可能只grep只有一列,并同时打印其他SELECTED输出
问题描述:
标题我不明确。这是我问的一个例子。是否有可能只grep只有一列,并同时打印其他SELECTED输出
#ls -l
打印我出这样的事情
-rw-r--r-- 1 root root 5110 2011-10-08 19:36 test.txt
-rw-r--r-- 1 root root 5111 2011-10-08 19:38 test.txt
-rw-r--r-- 1 root root 5121 2011-10-08 19:36 5110.txt
-rw-r--r-- 1 root root 5122 2011-10-08 19:38 5111.txt
说我想用grep来查找包含'511'
所有文件名,并打印出来的文件大小/文件名。
如何grep文件名'511'
,仍然打印文件大小,并没有输出包含前两行。
非常感谢你所以,阅读手册页并没有帮助我在这一个。
答
您可以使用awk
此:
pax:~$ echo '
-rw-r--r-- 1 root root 5110 2011-10-08 19:36 test.txt
-rw-r--r-- 1 root root 5111 2011-10-08 19:38 test.txt
-rw-r--r-- 1 root root 5121 2011-10-08 19:36 5110.txt
-rw-r--r-- 1 root root 5122 2011-10-08 19:38 5111.txt
' | awk '{if (substr($8,1,3)=="511"){print $5" "$8}}'
5121 5110.txt
5122 5111.txt
它只是简单地检查场8(文件名),看它是否与启动“511”,如果是这样,打印出的字段5和8,大小和名字。
答
如果它只是您想要过滤的文件名,为什么您首先列出其他文件?
ls -l *511* | cut -c23-30,48-
或甚至与awk
;
ls -l *511* | awk '{ $1 = $2 = $3 = $4 = $6 = $7 = ""; print }'
但是,ls
的输出不完全健壮,所以您应该避免直接处理它。
perl -le 'for (@ARGV) { print ((stat($_))[7], " $_") }' *511*
的stat()
系统调用返回一个机器可读的格式通过ls
显示的原始信息。任何工具,让您访问这些信息是好的;它不一定是Perl。
答
可以绕过ls
,只是使用bash
的文件名glob
:
for f in 511*
do
echo $f $(stat --format '%s' $f)
done
圣牛。我试图使用awk,但不知道如何执行if语句。非常有用的信息。谢谢! – Rell3oT
对于名称中有空格的文件,这不起作用。修复并不难。 – tripleee
此外,substr只在文件名的开头查找匹配项,而不是名称中的任何位置。同样,这不难解决,但应该避免解析'ls'输出。 – tripleee