grep 文件开头?

grep 文件开头?

在 Linux shell 中,我想确保一组文件都以 开头<?,并且包含该字符串,开头没有其他字符。我该如何 grep 或使用其他方式来表达“文件以 开头”?


编辑:我对此使用了通配符,并且head没有在同一行上给出文件名,因此当我 grep 它时,我看不到文件名。而且,"^<?"似乎没有给出正确的结果;基本上我得到的是:

$> head -1 * | grep "^<?"
<?
<?
<?
<?
<?
...

所有文件实际上都很好。

答案1

在 Bash 中:

for file in *; do [[ "$(head -1 "$file")" =~ ^\<\? ]] || echo "$file"; done

确保它们是文件:

for file in *; do [ -f "$file" ] || continue; [[ "$(head -1 "$file")" =~ ^\<\? ]] || echo "$file"; done

答案2

执行以下操作grep

$ head -n 1 * | grep -B1 "^<?"
==> foo <==
<?
--
==> bar <==
<?
--
==> baz <==
<?

解析文件名:

$ head -n 1 * | grep -B1 "^<?" | sed -n 's/^==> \(.*\) <==$/\1/p'
foo
bar
baz

答案3

您可以使用 awk 来实现此目的:

$ cat test1
<?xxx>
111
222
333
$ cat test2
qqq
aaa
zzz
$ awk '/^<\?/{print "Starting with \"<?\":\t" ARGV[ARGIND]; nextfile} {print "Not starting with \"<?\":\t" ARGV[ARGIND]; nextfile}' *
Starting with "<?":     test1
Not starting with "<?": test2
$

答案4

尝试这个

for i in `find * | grep "php$"`; do echo -n $i " -> "; head -1 $i; done

这将获取以 PHP 结尾的每个文件的列表,然后循环遍历它。回显文件名,然后打印文件的第一行。我刚刚插入

将会输出如下内容:

calendar.php  -> <?php
error.php  -> <?php
events.php  -> <?php
gallery.php  ->
index.php  -> <?php
splash.php  -> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
information.php  -> <?php
location.php  -> <?php
menu.php  -> <?php
res.php  -> <?php
blah.php  -> <?php

然后你可以在最后坚持一个正常的 grep 来摆脱你想要看到的东西,只找到例外

for i in `find * | grep "php$"`; do echo -n $i " -> "; head -1 $i; done | grep -v "<?php"

输出:

gallery.php  ->
splash.php  -> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

相关内容