从文件中提取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'filegrep -H'bar'file1 file2 file3:打印每次匹配的文件名