【shell】⽤grep查找包含字符串的⽂件grep过滤取匹配⾏的前
后n⾏
⽬录
即可即⽤
grep 匹配多个关键字
1、 grep ‘字符串’
fig | grep 'MANPATH'
2、 反向匹配
fig| grep -v 'MANPATH'
3、 匹配多个关键字之⼀
grep -E "word1|word2|word3"
4、 反向匹配多个关键字之⼀
grep -vE "word1|word2|word3"
5、同时满⾜多个关键字
grep | grep word2 |grep word3
与find的不同
find命令是根据⽂件的属性进⾏查找,如⽂件名,⽂件⼤⼩,所有者,所属组,是否为空,访问时间,修改时间等。
grep是根据⽂件的内容进⾏查找,会对⽂件的每⼀⾏按照给定的模式(patter)进⾏匹配查找。
grep检索⽂件内容详解
(1) 指定⽂件类型:
find -type f -name '*.h' | xargs grep "hello"
(2) 排除java和c⽂件类型
grep "hello" -nR --exclude=*.{java,c}
(3) 排除lib⽬录查找⽂件init.c
(4)grep 转义字符“\” 查找
(5)⾮递归搜索
-s 选项会在发现不存在或者不能读取的⽂件时隐藏报错信息。
(5)递归搜索
grep -R "stretch "/etc/*
grep -rEn perl /usr/bin/
grep -Rl "3306" * 这句可以显⽰在哪个⽂件⾥包含3306
grep -REn "3306" * 可以显现⽂件名,⾏数
R 表⽰递归,就是在当前⽬录找不到就去⼦⽬录找
E 表⽰把⽂件名也打印出来
n 打印此⾏在⽂件中的位置
礼仪有哪些(6)显⽰⾏号
grep -Rni bash /etc/*.conf
grep 不起作⽤?过滤了还是显⽰
rvice --status-all | grep network,即使我将其通过管道传送到grep以仅将其限制为”network”字符串,它仍然列出所有服务
解决办法:
rvice --status-all |& grep network
Stdout的编号为1,stderr的编号为2。默认情况下,重定向操作符(如>,|和<)仅适⽤于stdout的编号1。
|&将stdout和stderr⼀起输送到右侧标准输⼊(stdin)流上的进程,这使grep可以按预期⼯作。
更多过滤
约定:
# - 需要使⽤ root 权限来执⾏指定,可以直接使⽤ root ⽤户来执⾏也可以使⽤ sudo
$ - 可以使⽤普通⽤户来执⾏指定命令
案例
搜索包含[指定字符串]的⽂件
⾮递归
第⼀个例⼦让我们来搜索 /etc/ ⽬录下所有包含 stretch 字符串的⽂件,但不去搜索其中的⼦⽬录:
# grep -s stretch /etc/*
/etc/os-relea:PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
/etc/os-relea:VERSION="9 (stretch)"
grep 的 -s 选项会在发现不存在或者不能读取的⽂件时隐藏报错信息。结果显⽰除了⽂件名之外,还有包含请求字符串的⾏也被⼀起输出了。
递归
上⾯案例中忽略了所有的⼦⽬录。所谓递归搜索就是指同时搜索所有的⼦⽬录。
下⾯的命令会在 /etc/ 及其⼦⽬录中搜索包含 stretch 字符串的⽂件:
/etc/apt/sources.list:# deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main /etc/apt/sources.list:#deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main /etc/apt/sources.list:deb ftp./debian/ stretch main
/etc/apt/sources.list:deb-src ftp./debian/ stretch main
/etc/apt/sources.list:deb /debian-curity stretch/updates main
/etc/apt/sources.list:deb-src /debian-curity stretch/updates main
/etc/dictionaries-common/words:backstretch
/etc/dictionaries-common/words:backstretch's
/etc/dictionaries-common/words:backstretches
/etc/dictionaries-common/words:homestretch
/etc/dictionaries-common/words:homestretch's
/etc/dictionaries-common/words:homestretches
/etc/dictionaries-common/words:outstretch
/etc/dictionaries-common/words:outstretched
/etc/dictionaries-common/words:outstretches
/etc/dictionaries-common/words:outstretching
/etc/dictionaries-common/words:stretch
/etc/dictionaries-common/words:stretch's
/
etc/dictionaries-common/words:stretched
/etc/dictionaries-common/words:stretcher
/etc/dictionaries-common/words:stretcher's
/etc/dictionaries-common/words:stretchers
/etc/dictionaries-common/words:stretches
/etc/dictionaries-common/words:stretchier
/etc/dictionaries-common/words:stretchiest
/etc/dictionaries-common/words:stretching
/etc/dictionaries-common/words:stretchy
/etc/grub.d/00_header:background_image -m stretch `make_system_path_relative_to_its_root "$GRUB_BACKGROUND"`
/etc/os-relea:PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
四年级上册语文课本/etc/os-relea:VERSION="9 (stretch)"
搜索包含[特定单词]的⽂件
上⾯ grep 命令的案例中列出的是所有包含字符串 stretch 的⽂件。也就是说包含 stretches , stretched 等内容的⾏也会被显⽰。 使⽤ grep 的 -w 选项会只显⽰包含特定单词的⾏:
# grep -Rw stretch /etc/*
/etc/apt/sources.list:# deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main /etc/apt/sources.list:#deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main /etc/apt/sources.list:deb ftp./debian/ stretch main
/etc/apt/sources.list:deb-src ftp./debian/ stretch main
/etc/apt/sources.list:deb /debian-curity stretch/updates main
/etc/apt/sources.list:deb-src /debian-curity stretch/updates main
/etc/dictionaries-common/words:stretch
/etc/dictionaries-common/words:stretch's
/etc/grub.d/00_header:background_image -m stretch `make_system_path_relative_to_its_root "$GRUB_BACKGROUND"`
胎记怎样形成的/etc/os-relea:PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
/etc/os-relea:VERSION="9 (stretch)"
显⽰包含[特定⽂本]的⽂件
上⾯的命令都会产⽣多余的输出。下⼀个案例则会递归地搜索 etc ⽬录中包含 stretch 的⽂件并只输出⽂件名:
# grep -Rl stretch /etc/*
/etc/apt/sources.list
/etc/dictionaries-common/words
/etc/grub.d/00_header
/etc/os-relea
⼤⼩写不敏感的搜索
默认情况下搜索是⼤⼩写敏感的,也就是说当搜索字符串 stretch 时只会包含⼤⼩写⼀致内容的⽂件。
通过使⽤ grep 的 -i 选项,grep 命令还会列出所有包含 Stretch , STRETCH , StReTcH 等内容的⽂件,也就是说进⾏的是⼤⼩写不敏感的搜索。
# grep -Ril stretch /etc/*
/etc/apt/sources.list
/etc/dictionaries-common/default.hash
/etc/dictionaries-common/words
/etc/grub.d/00_header
/etc/os-relea
搜索时包含/排除指定⽂件
护士实习周记grep 命令也可以只在指定⽂件中进⾏搜索。⽐如,我们可以只在配置⽂件(扩展名为.conf)中搜索指定的⽂本/字符串。 下⾯这个例⼦就会在 /etc ⽬录中搜索带字符串 bash 且所有扩展名为 .conf 的⽂件:
# grep -Ril bash /etc/*.conf
OR
# grep -Ril --include=\*.conf bash /etc/*
/f
类似的,也可以使⽤ --exclude 来排除特定的⽂件:
# grep -Ril --exclude=\*.conf bash /etc/*
青少年普法教育
/etc/alternatives/view
/etc/alternatives/vim
/etc/alternatives/vi
/etc/alternatives/vimdiff
/etc/alternatives/rvim
/etc/alternatives/ex
/etc/alternatives/rview
/etc/bash.bashrc
/etc/bash_completion.d/grub
/etc/cron.daily/apt-compat
/etc/cron.daily/exim4-ba
/etc/dictionaries-common/default.hash
/etc/dictionaries-common/words
/
etc/inputrc
/etc/passwd
/etc/passwd-
/etc/profile
/etc/shells
/etc/skel/.profile
/etc/skel/.bashrc
/etc/skel/.bash_logout
搜索时排除指定⽬录
跟⽂件⼀样,grep 也能在搜索时排除指定⽬录。 使⽤ --exclude-dir 选项就⾏。
下⾯这个例⼦会搜索 /etc ⽬录中搜有包含字符串 stretch 的⽂件,但不包括 /etc/grub.d ⽬录下的⽂件:
# grep --exclude-dir=/etc/grub.d -Rwl stretch /etc/*
/etc/apt/sources.list
/etc/dictionaries-common/words
/etc/os-relea
显⽰包含搜索字符串的⾏号
-n 选项还会显⽰指定字符串所在⾏的⾏号:
# grep -Rni bash /etc/*.conf
/f:6:DSHELL=/bin/bash
寻找不包含[指定字符串]的⽂件
最后这个例⼦使⽤ -v 来列出所有不包含指定字符串的⽂件。
例如下⾯命令会搜索 /etc ⽬录中不包含 stretch 的所有⽂件:
# grep -Rlv stretch /etc/*
文庙社区
只取第⼀⾏、取前n⾏、取前n字节、取末尾n⾏、不显⽰前n⾏/后n⾏(head命令与tail命令)
鱿鱼营养价值#显⽰前5个字节
head -c
# 只显⽰前五⾏
head -n
# 只显⽰末尾五⾏
tail -n 过敏反应的特点
# 只显⽰第三⾏到末尾(不显⽰前两⾏)
tail -n +
# 只显⽰开头到末尾第三⾏(不显⽰末尾两⾏)
head -n -
# 只显⽰开头第三⾏到末尾第三⾏(不显⽰前两⾏且不显⽰末尾两⾏)
tail -n + | head -n -3
只取第⼀⾏
grep *.*|head -n 1
只取前n⾏
#显⽰前5⾏
head -n
只取前n字节
head 【参数】【⽂件】
2、命令选项
-
c, --bytes=[-]K k,显⽰⽂档开始的前k个字节,-k,不显⽰⽂档结尾的最后 k 个字节-n, --lines=[-]K k,显⽰⽂档开始的前k⾏,-k,不显⽰⽂档结尾的最后 k ⾏
-q, --quiet, --silent 不显⽰包含给定⽂件名的⽂件头
-v, --verbo 总是显⽰包含给定⽂件名的⽂件头
--help 显⽰此帮助信息并退出
--version 显⽰版本信息并退出