【Linux常用命令13】Linux三剑客---grep,sed,awk

grep命令:在文件中提取和匹配符合条件的字符串

grep [选项] [条件] 文件
#常用参数
参数  含义
-i   搜索时,忽略大小写
-c   只输出匹配行的数量
-l   只列出符合匹配的文件名,不列出具体的匹配行
-n   列出所有的匹配行,显示行号
-h   查询多文件时不显示文件名
-s   不显示不存在、没有匹配文本的错误信息
-v   显示不包含匹配文本的所有行
-w   匹配整词
-x   匹配整行
-r   递归搜索
-q   禁止输出任何结果,已退出状态表示搜索是否成功
-b   打印匹配行距文件头部的偏移量,以字节为单位
-o   与-b结合使用,打印匹配的词据文件头部的偏移量,以字节为单位
​
grep 的规则表达式:
^  #锚定行的开始 如:'^grep'匹配所有以grep开头的行。 
$  #锚定行的结束 如:'grep$'匹配所有以grep结尾的行。 
.  #匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。  
*  #匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
.*   #一起用代表任意字符。  
[]   #匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。 
[^]  #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。  
\(..\)  #标记匹配字符,如'\(love\)',love被标记为1。   
\<      #锚定单词的开始,如:'\      #锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
x\{m\}  #重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。 
x\{m,\}  #重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。  
x\{m,n\}  #重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。  
\w    #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。  
\W    #\w的反置形式,匹配一个或多个非单词字符,如点号句号等。  
\b    #单词锁定符,如: '\bgrep\b'只匹配grep。
#示例
以noLogin结尾的 不区分大小写
[root@linuxcool ~\]# grep -i "noLogin$" passwd.txt
支持多文件查询并支持使用通配符:
[root@linuxcool ~\]# grep zwx file_* /etc/hosts
file_1:zwx
file_1:zwx
file_1:zwxddkjflkdjfdlkfjlsdkj
file_2:zwx
file_4:dkfjlzwxejfkje
file_4:zwx djfkdjf
file_4:zwxedkfgj
输出匹配字符串行的数量:
[root@linuxcool ~]$ grep -c zwx file_*
 file_1:2
 file_2:1
 file_3:0
列出所有的匹配行,并显示行号:
[root@linuxcool ~]# grep -n zwx file_*
 file_1:1:zwx
 file_1:4:zwx
 file_1:10:zwxddkjflkdjfdlkfjlsdkj
 file_2:2:zwx
 file_4:3:dkfjlzwxejfkje
 file_4:4:zwx djfkdjf
 file_4:5:zwxedkfgj
显示不包含模式的所有行:
[root@linuxcool ~]# grep -vc zwx file_*
 file_1:7                                
 file_2:4
 file_3:5
 file_4:2
不再显示文件名:
[root@linuxcool ~]# grep -h zwx file_*
 zwx
 zwx
 zwxddkjflkdjfdlkfjlsdkj
 zwx
 dkfjlzwxejfkje
 zwx djfkdjf
 zwxedkfgj
只列出符合匹配的文件名,不列出具体匹配的行:
[root@linuxcool ~]# grep -l zwx file_*
 file_1
 file_2
 file_4
不显示不存在或无匹配的文本信息:
[root@linuxcool ~]# grep  -s zwx file1 file_1
 file_1:zwx       
 file_1:zwx
 file_1:zwxddkjflkdjfdlkfjlsdkj
[root@linuxcool ~]# grep zwx file1 file_1
 grep: file1: No such file or directory  
 file_1:zwx
 file_1:zwx
 file_1:zwxddkjflkdjfdlkfjlsdkj
递归搜索,不仅搜索当前目录,还搜索子目录:
[root@linuxcool ~]# grep -r zwx file_2 *
 file_2:zwx
 anaconda-ks.cfg:user --name=zwx --gecos="zwx"
 file_1:zwx
 file_1:zwx
 file_1:zwxddkjflkdjfdlkfjlsdkj
 file_2:zwx
 file_4:dkfjlzwxejfkje
 file_4:zwx djfkdjf
 file_4:zwxedkfgj
 initial-setup-ks.cfg:user --name=zwx --gecos="zwx"
匹配整词,以字面意思去解释他,相当于精确匹配:
[root@linuxcool ~]# grep zw* file_1
 zwx                       
 zwx
 zdkfjeld
 zw
 ze
 zwxddkjflkdjfdlkfjlsdkj
[root@linuxcool ~]# grep -w zw* file_1
 zw
匹配整行,文件中的整行与模式匹配时,才打印出来:
[root@linuxcool ~]# grep -x zwx file_*
 file_1:zwx
 file_1:zwx
 file_2:zwx
不输出任何结果,已退出状态表示结果:
[root@linuxcool ~]# grep -q zwx file_1
[root@linuxcool ~]# echo $?
 0               
[root@linuxcool ~]# grep -q zwx file_5
[root@linuxcool ~]# echo $?
 1               
[root@linuxcool ~]# grep -q zwx file5
 grep: file5: No such file or directory
[root@linuxcool ~]# echo $?
 2
[root@linuxcool ~]# grep -c ^$ file_1
 4              
[root@linuxcool ~]# grep -c ^[^$] file_1
 15
匹配任意或重复字符用".“或”*"符号来实现:
[root@linuxcool ~]# grep ^z.x file_1
 zwx
 zwx
 zwxddkjflkdjfdlkfjlsdkj
[root@linuxcool ~]# grep ^z* file_6
 zwx                  
 zzdfjkd
 zz dfdww

sed命令:处理编辑文本文件

sed [选项] ‘command’ 文件
参数  含义
-e   直接在命令行模式上进行sed动作编辑,此为默认选项
-f   将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
-i   直接修改文件内容
-h   显示帮助
-n   只打印模式匹配的行
-V或--version    显示版本信息
​
命令  功能
a\   在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行
c\   用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用""续行
i\   在当前行之前插入文本。多行时除最后一行外,每行末尾需用""续行
d    删除行
h    把模式空间里的内容复制到暂存缓冲区
H    把模式空间里的内容追加到暂存缓冲区
g    把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
G    把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
l    列出非打印字符
n    读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
q    结束或退出sed
!    对所选行以外的所有行应用命令
s    用一个字符串替换另一个
r file  从file中读行
w file  写并追加模板块到file末尾
=    打印当前行号
​
参数  含义
g    表示行内全面替换
p    表示打印行
w    表示把行写入一个文件
&    已匹配字符串标记
\1   子串匹配标记
x    表示互换模板块中的文本和缓冲区中的文本
y    表示把一个字符翻译为另外的字符(但是不用于正则表达式)
​
sed元字符集
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行;
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行;
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d; 
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行; 
[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed; 
[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行;  
\(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers;  
& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**;  
\< 匹配单词的开始,如:/\ 
\> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行; 
x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行; 
x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行; 
x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行;
示例:
替换文本中的字符串
[root@linuxcool ~]# sed 's/book/books/' file
直接编辑文件选项-i,会匹配file文件中每一行的第一个book替换为books
[root@linuxcool ~]# sed -i 's/book/books/g' file
删除空白行:
sed '/^$/d' file
​
e选项允许在同一行里执行多条命令:
sed表达式的第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
sed -e '1,5d' -e 's/test/check/' file

awk命令

awk [参数] {条件动作} 文件
-F 指定分割符
用-F指定的分割符将文件分割,分割后
0代表整行1代表第一列
2代表第二列NF代表最后一列
$(NF-1)代表倒数第二列
NF 列数
NR 行号
只有条件没有动作 表示过滤符合条件的行
#示例
awk -F: '{print NR,$1,$6}' passwd.txt |column -t 使用awk取passwd.txt用户名及家目录并显示行号

你可能感兴趣的:(Linux基础知识,linux,运维,服务器,shell)