从文件中提取Grep并在Linux或Unix系统上显示文件名
时间:2020-01-09 14:16:35 来源:igfitidea点击:
如何从多个文件中复制并仅显示文件名?
如何强制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.theitroad.local并仅显示匹配的文件名,运行:
grep -l -R 'http://www.theitroad.local'
现在,使用sed命令将所有出现的http://www.theitroad.local替换为https://www.theitroad.local:
## get filenames ## files=$(grep -l -R 'http://www.theitroad.local' . ) echo "$files" ## replace using sed ## for f in $files do sed -i 's+http://www.theitroad.local+https://www.theitroad.local+g' "$f" done
总结
从文件中执行Grep并显示文件名
grep -l'word'file1 file2
:在Linux和Unix上显示文件名,而不是正常输出grep -L'string'file1 file2
:禁止正常输出并显示通常不会打印输出的文件名grep -n'string'filename
:强制grep在输出的每一行之前在其输入文件中添加行号作为前缀grep --with-filename'word'file
或grep -H'bar'file1 file2 file3
:打印每次匹配的文件名