我希望grep * filename
打印 的每一行,filename
因为我认为*
会匹配该文件的每一行。
$ cat filename
first line
second line
*
$ grep * filename #Why won't this print anything?
$
为什么没有呢?
答案1
首要问题:
如果您*
直接放入 shell 而不引用它,则在执行命令之前,shell 会将其扩展到当前目录中的文件列表。
第二期:
grep
默认情况下使用正则表达式来匹配模式。在正则表达式中*
,表示“匹配模式零次或多次”,而句点 ( .
) 表示“匹配任何字符”。
所以你想要的是这样的:grep ".*" filename
。或者只使用猫
答案2
grep ^ filename
将打印每一行,因为每一行都有一个开头,这就是 ^ 匹配的内容。 (根据正则表达式的实现,它很可能比匹配 .* 更有效)
grep . filename
删除完全空的行(没有任何内容的行,包括空格和制表符)。
如果您有多个文件,则此命令更有用,因为 grep 默认情况下会打印文件名。例如在我的系统上
grep ^ /proc/sys/kernel/shm*
产生
/proc/sys/kernel/shmall:18446744073692774399
/proc/sys/kernel/shmmax:18446744073692774399
/proc/sys/kernel/shmmni:4096
/proc/sys/kernel/shm_next_id:-1
/proc/sys/kernel/shm_rmid_forced:0
所以我可以用一个命令查看 5 个值。