grep和awk命令速记
grep 命令
格雷普 “一种” 提取含有字符a的每一行
例如: netstat -ant | 格雷普 “是”
grep -v “#” file 过滤掉file中的注释
例如: grep -v “#” 配置文件 >> /等/httpd.conf
握力-n “匹配内容”file 打印出输出信息的行
例如: 抢-n-v “#” nginx.conf 去掉nginx.conf的注释,输出其他内容以及它们的行号。
grep -c 只输出匹配的行的计数
例如: 抓取-c “2004” myfile 显示myfile文件中出现2004有多少行,只输出一个数字。
格雷普 “2004:22:5[0-9]” myfile 显示myfile中2004:22:50到2004:22:59的内容。
格雷普 “^[^210]” myfile 过滤掉开头不是2不是1不是0的行。
grep -i “内容” 文件, 匹配文件的内容,不区分大小写。
\ :屏蔽元字符的特殊含义,如*.pas 表示匹配以 *.pas类型的文件
[] :匹配[]内的字符,可以是单字符也可以是多字符。里面用-表示范围。如用[1-5]代替[12345]
. :匹配任意单字符
* :匹配任意单字符或多个字符,如:10133*1 匹配 101331 ,101333921 , 10133AS1
^ :匹配输入字符串的开始行
$ :匹配输入字符串的结束行
^$ : 匹配空行
^.$ :匹配只有一个字符的行
例如:grep ^events file 打印出文件file中以events开始的行。
例如:grep abc$ file 打印出文件file中以abc结尾的行。
例如:grep ^$ file 打印出文件file中的空行。
例如:grep -n ^$ file 打印出文件file中的空行,以及空行所在的行号。
AWK命令
awk自带有一个循环,先读取第一行,进行分段,操作;再读取第二行,进行分段,操作;
直到读取最后一行,进行分段,操作。
awk‘{命令}’ 文件
如果有多个命令的话,各个命令之间用;隔开。
awk‘{命令1;命令2;命令3}’ 文件
如果需要匹配特定的行,可在花括号左方写入模式匹配。
awk ‘/模式/{命令1;命令2;命令3}’ 文件
如:猫 /etc/passwd | 你-F: '/根/{打印 $1}’ 匹配含有root的那一行,并打印出那行的第1列。
猫 /etc/passwd | 你-F: '/根/{打印 $1,$2}’ 匹配含有root的那一行,并打印出那行的第1列和第2列。
猫 /etc/passwd | 你-F: '/^根/{打印 $1}’匹配开头有root的。
猫 /etc/passwd | 你-F: '$2 ~ /根/{打印 $1}’ 匹配第2个字段含有root的。
猫 /etc/passwd | 你“开始”{FS=”:”}$2 〜/根/{打印 $1}’ 读取第一行之前,定义变量FS,分隔符为冒号。
猫 /etc/passwd | 你“开始”{FS=”:”}$2 〜/根/{打印 $1,$2}’ 如果想输出多个部分的话,可以用逗号隔开。
猫 /etc/passwd | 你“开始”{FS=”:”}$2 〜/根/{打印 $1 $2}’ 如果不写逗号的话,输出的内容会连在一起。
awk默认的输出分隔符是空格,如何改变输出的分隔符呢?使用变量OFS。
猫 /etc/passwd | 你“开始”{FS=”:”; OFS=”-“}$2 〜/根/{打印 $1,$2}’使输出的分隔符变为-。
有BEGIN就会有END, END就是扫尾的意思。当把所有的行读取完毕后,最后执行END操作。
你“开始”{命令}/模式/{命令1;命令2;命令3}结尾{命令}’ 文件
ifconfig eth0 | 格雷普 “网络地址” | 你“开始”{打印xxx}{打印 $2}结尾{打印年}’
输出为: 网络地址:IP地址
并没有输出xxxx和yyyy,因为使用print时,如果print后面是变量名,可不使用””;
如果print后面不是变量名的话,必须使用””括起来。
ifconfig eth0 | 格雷普 “网络地址” | 你“开始”{打印 “xxxx”}{打印 $2}结尾{打印 “yyyy”}’
输出为:
xxxx
网络地址:IP地址
yyyy
刚才讲了变量FS和OFS,现在讲NF和NR
核因子:每一行的字段数
WHO | awk‘{打印NR}’ 显示出每一行有多少个字段数。
你-F: ‘{打印NF}’ /etc/passwd 用:作为分隔符,显示passwd中的每一行有多少个字段。
你-F: '/^根/{打印NF}’ /etc/passwd 开头为root那一行有多少个字段。
NR:awk处理的这行内容在原文中是第几行,也就是显示行号。
grep -n ^root /etc/passwd 在passwd文件中,以root开头的那行在原文是第几行。
你-F: '/^根/{打印NR}’ /etc/passwd 在passwd文件中,以root开头的那行在原文是第几行。
除了awk自带的变量外,awk还可以自定义变量。
统计root出现了几次
你-F: '开始{氨基酸=0}/根/{AA++}结尾{打印aa}’ 密码
这条命令的意思是,在读取passwd文件之前,首先定义一个变量aa,初始值为0,
如果含有root的话,那么变量aa自加1,当把passwd中所有的行读完了,再执行END里面的命令,输入aa的值。
注意:当引用变量的时候是不加$的,这个和shell或者其他一些语言不一样 。
你“开始” {操作1} {操作2} 结尾 {操作3}’ file 在操作2执行之前先做操作1,然后操作2,操作2完成后执行操作3.
BEGIN通常是在对文件正式操作之前赋初值 ,END通常是在文件操作后,输出结果进行扫尾工作。
awk读取数据会一行一行(记录)的读取,一条记录又分若干个字段(列),并将第1个字段放入变量$1中,
第2个变量放入变量$2中,以此类推,$0表示整条记录;
NR : 当前的记录号(第几行)
核因子: 当前的字段(域)个数(有多少列)
-F “#” 表示将每一个域(每一列)之间的分隔符(空格)用#代替,这样更加直观。
例如:你-F “#” ‘{打印 $0}’ nginx.conf 打印出nginx.conf中的每一条记录(每一行)
的所有字段(每一行的所有列)并将每一列之间的分隔符(空格)用#代替。
awk‘{打印 $0}’ myfile 打印出myfile中所有的记录(行)。
$0就是整条记录 ,$1是记录的第1个字段,$2是记录的第2个字段,$3是记录的第3个字段,以此类推。
但不要和shell中的$混淆。
例如:你-F “#” ‘{打印NF,NR,$0}’ nginx.conf 打印出nginx.conf中的每一条记录(每一行)
的所有字段(每一行的所有列)并将每一列之间的分隔符(空格)用#代替。同时统计每一条记录所在的行号,
每一条记录有多少个字段(列)。
那么打印出的顺序为:
此记录有多少个字段(核因子) 此记录在第几行 (NR) 记录内容($0)(字段1#字段2)
此记录有多少个字段(核因子) 此记录在第几行 (NR) 记录内容($0)(字段1#字段2)
此记录有多少个字段(核因子) 此记录在第几行 (NR) 记录内容($0)(字段1#字段2)
awk中特殊的元字符: + ,? +表示匹配任意字符,?表示匹配任意字符。
匹配操作符: ~ , !~ 。 其中~表示匹配, !~表示不匹配。 后面跟上匹配或不匹配的内容,内容用//括起来。
例如:
猫分数.txt | awk ‘$0~/218.79.131.96/’ 先输出score.txt的内容,再找出带有IP 218.79.131.96的整条记录。
猫分数.txt | awk ‘$0!~/218.79.131.96/’ 先输出score.txt的内容,再过滤带有IP 218.79.131.96的整条记录。
awk‘{如果($1==”218.79.131.96″) 打印函数 $0}’ score.txt 在文件sorce.txt中
如果某条记录的第1个字段匹配218.79.131.96,那么就输出包含这个记录的整个字段。
awk所有的操作都在引号之间。
awk的大体格式
awk‘{123}{345}{345}{456}’ file 大括号之间没有空格
实时打印nginx的access日志里,访问的IP地址, 用-作为分隔符
尾-f /var/log/nginx/access.log | 你-F- ‘{打印 $1}’
[根@app01 ~]# mpstat -P 全部 | grep -v Linux | 排序-k4nr | 头 -5
有文本如下a.txt,awk ,取第3行 第3列的值
01:34:14 下午 2 16.13 0.00 0.81 0.01 0.00 0.24 0.00 0.00 82.82
01:34:14 下午 1 11.65 0.00 0.63 0.00 0.00 0.15 0.00 0.00 87.58
01:34:14 下午 3 11.59 0.00 0.64 0.00 0.00 0.11 0.00 0.00 87.66
01:34:14 下午 18 7.82 0.00 0.36 0.00 0.00 0.00 0.00 0.00 91.82
01:34:14 下午 16 7.21 0.00 0.41 0.00 0.00 0.02 0.00 0.00 92.36
[根@app01 ~]# 猫a.txt |你'NR==3{打印 $3}’
3