在 Linux 或 Unix 系统中从文件中 Grep 并显示文件名
您是否需要在 Linux 或 Unix 机器中使用 grep 并显示文件名?试试这些技巧。因此,当有多个文件需要搜索时,它将默认显示文件名。请考虑以下grep 命令语法:
grep "word" filename grep root /etc/*
示例输出:
/etc/bash.bashrc: See "man sudo_root" for details. /etc/crontab:17 * * * * root cd / && run-parts --report /etc/cron.hourly /etc/crontab:25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) /etc/crontab:47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) /etc/crontab:52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) /etc/group:root:x:0: grep: /etc/gshadow: Permission denied /etc/logrotate.conf: create 0664 root utmp /etc/logrotate.conf: create 0660 root utmp
第一个名称是文件名(例如 /etc/crontab、/etc/group)。如果 grep 找到匹配项,则 -l 选项将仅打印文件名:
grep -l "string" filename grep -l root /etc/*
示例输出:
/etc/aliases /etc/arpwatch.conf grep: /etc/at.deny: Permission denied /etc/bash.bashrc /etc/bash_completion /etc/ca-certificates.conf /etc/crontab /etc/group
您可以抑制正常输出;而是打印每个通常不会打印输出的输入文件的名称:
grep -L "word" filename grep -L root /etc/*
示例输出:
/etc/apm /etc/apparmor /etc/apparmor.d /etc/apport /etc/apt /etc/avahi /etc/bash_completion.d /etc/bindresvport.blacklist /etc/blkid.conf /etc/bluetooth /etc/bogofilter.cf /etc/bonobo-activation /etc/brlapi.key
如何在 grep 中的匹配行之前显示文件名
如果您提供多个文件名,则默认情况下 grep 显示文件名。例如:
$ grep 'foo' file1 file2
$ grep '192.168.2.254' /etc/hosts /etc/resolv.conf
$ grep -n '192.168.2.254' /etc/hosts /etc/resolv.conf
####################################################
## Always show filename headers with output lines.##
## Works with BSD/macOS/GNU/Linux grep version ##
####################################################
$ grep -H 'search-word' filename1 filename2
$ grep '192.168.2.254' /etc/hosts /dev/null
##########################
### gnu/Linux grep only ##
##########################
$ grep --with-filename 'foo' file1 file2
$ grep --with-filename '192.168.2.253' /etc/{hosts,resolv.conf}
Linux grep 显示匹配行之前的文件名
grep 显示匹配行之前的文件名
在这个例子中,我需要在所有文件中搜索“http://www.example.com”,并仅在当前工作目录 [CWD] 中显示匹配的文件名(有关 CWD 的更多信息,请参阅pwd 命令
$ grep -l -R 'http://www.example.com'
),运行:
现在使用 sed 命令将所有出现的“http://www.example.com”替换为“https://www.example.com”:
## get filenames ## files=$(grep -l -R 'http://www.example.com' . ) echo "$files" ## replace using sed ## for f in $files do sed -i 's+http://www.example.com+https://www.example.com+g' "$f" done
了解如何在 Linux / Unix shell 中使用 sed 查找和替换文件中的文本。
结论 – 从文件中 Grep 并显示文件名
让我们总结一下 Linux 或 Unix 中的所有 grep 命令选项:
- grep -l ' word ' file1 file2:在 Linux 和 Unix 上显示文件名,而不是正常输出
- grep -L ' string'file1file2:抑制正常输出并显示通常不会打印输出的文件名
- grep -n ' string'filename :强制 grep在输出的每一行前面添加输入文件中的行号作为前缀
- grep --with-filename ' word ' file
或
grep -H ' bar ' file1 file2 file3:打印每个匹配的文件名
要了解有关这些选项的更多信息,请使用 man 命令/help 命令或 info 命令查看 grep 命令手册页(您可以在此处阅读 GNU/grep 帮助,在此处阅读BSD/grep帮助):
本页中使用的所有 grep 选项的快速帮助提示,用于 grep 并显示文件名:
$ man grep
$ info grep #<--GNU grep
$ grep --help | grep -Ew -- '-(l|L|n|H)'