Abkürzung für grep- und awk-Befehle

grep 命令

grep “ein” 提取含有字符a的每一行

Z.B: netstat -ant | grep “OSTEN”

grep -v “#” file 过滤掉file中的注释

Z.B: grep -v “#” httpd.conf >> /etc/httpd.conf

grep -n匹配内容file 打印出输出信息的行

Z.B: grep -n -v “#” nginx.conf 去掉nginx.conf的注释输出其他内容以及它们的行号

grep -c 只输出匹配的行的计数

Z.B: grep -c “2004” myfile 显示myfile文件中出现2004有多少行只输出一个数字

grep “2004:22:5[0-9]” myfile 显示myfile中2004:22:50到2004:22:59的内容

grep “^[^210]” myfile 过滤掉开头不是2不是1不是0的行

grep -i内容” Datei, 匹配文件的内容不区分大小写

\ :屏蔽元字符的特殊含义如\*\.pas 表示匹配以 *.pas类型的文件

[] :匹配[]内的字符可以是单字符也可以是多字符里面用-表示范围如用[1-5]代替[12345]

. :匹配任意单字符

* :匹配任意单字符或多个字符,Sowie:10133*1 匹配 101331 ,101333921 , 10133AS1

^ :匹配输入字符串的开始行

$ :匹配输入字符串的结束行

^$ : 匹配空行

^.$ :匹配只有一个字符的行

Z.B:grep ^events file 打印出文件file中以events开始的行

Z.B:grep abc$ file 打印出文件file中以abc结尾的行

Z.B:grep ^$ file 打印出文件file中的空行

Z.B:grep -n ^$ file 打印出文件file中的空行,以及空行所在的行号

AWK命令

awk自带有一个循环先读取第一行进行分段操作再读取第二行进行分段操作

直到读取最后一行进行分段操作

awk ‘{命令}’ Datei

如果有多个命令的话各个命令之间用隔开

awk ‘{命令1命令2命令3}’ Datei

如果需要匹配特定的行可在花括号左方写入模式匹配

awk ‘/模式/{命令1命令2命令3}’ Datei

Sowie:cat /etc/passwd | awk -F: ‘/root/{drucken $1}’ 匹配含有root的那一行并打印出那行的第1列

cat /etc/passwd | awk -F: ‘/root/{drucken $1,$2}’ 匹配含有root的那一行并打印出那行的第1列和第2列

cat /etc/passwd | awk -F: ‘/^root/{drucken $1}’匹配开头有root的

cat /etc/passwd | awk -F: ‘$2 ~ /root/{drucken $1}’ 匹配第2个字段含有root的

cat /etc/passwd | awk ‘BEGIN{FS=”:”}$2 ~ /root/{drucken $1}’ 读取第一行之前定义变量FS分隔符为冒号

cat /etc/passwd | awk ‘BEGIN{FS=”:”}$2 ~ /root/{drucken $1,$2}’ 如果想输出多个部分的话可以用逗号隔开

cat /etc/passwd | awk ‘BEGIN{FS=”:”}$2 ~ /root/{drucken $1 $2}’ 如果不写逗号的话输出的内容会连在一起

awk默认的输出分隔符是空格如何改变输出的分隔符呢?使用变量OFS

cat /etc/passwd | awk ‘BEGIN{FS=”:”; OFS=”-“}$2 ~ /root/{drucken $1,$2}’使输出的分隔符变为-

有BEGIN就会有END, END就是扫尾的意思当把所有的行读取完毕后最后执行END操作

awk ‘BEGIN{命令}/模式/{命令1命令2命令3}ENDE{命令}’ Datei

ifconfig eth0 | grep “inet addr” | awk ‘BEGIN{print xxxx}{drucken $2}ENDE{print yyyy}’

输出为inet addr:IP地址

并没有输出xxxx和yyyy因为使用print时如果print后面是变量名可不使用””;

如果print后面不是变量名的话必须使用””括起来

ifconfig eth0 | grep “inet addr” | awk ‘BEGIN{drucken “xxxx”}{drucken $2}ENDE{drucken “yyyy”}’

输出为

xxxx

inet addr:IP地址

yyyy

刚才讲了变量FS和OFS,现在讲NF和NR

NF:每一行的字段数

who | awk ‘{print NR}’ 显示出每一行有多少个字段数

awk -F: ‘{print NF}’ /etc/passwd 用作为分隔符显示passwd中的每一行有多少个字段

awk -F: ‘/^root/{print NF}’ /etc/passwd 开头为root那一行有多少个字段

NR:awk处理的这行内容在原文中是第几行也就是显示行号

grep -n ^root /etc/passwd 在passwd文件中以root开头的那行在原文是第几行

awk -F: ‘/^root/{print NR}’ /etc/passwd 在passwd文件中以root开头的那行在原文是第几行

除了awk自带的变量外awk还可以自定义变量

统计root出现了几次

awk -F: ‘BEGIN{aa=0}/root/{aa++}ENDE{print aa}’ passwd

这条命令的意思是在读取passwd文件之前首先定义一个变量aa,初始值为0

如果含有root的话那么变量aa自加1当把passwd中所有的行读完了再执行END里面的命令输入aa的值

Hinweis:当引用变量的时候是不加$的这个和shell或者其他一些语言不一样

awk ‘BEGIN {操作1} {操作2} ENDE {操作3}’ file 在操作2执行之前先做操作1然后操作2操作2完成后执行操作3.

BEGIN通常是在对文件正式操作之前赋初值END通常是在文件操作后输出结果进行扫尾工作

awk读取数据会一行一行(记录)的读取一条记录又分若干个字段(列)并将第1个字段放入变量$1中

第2个变量放入变量$2中以此类推,$0表示整条记录

NR : 当前的记录号(第几行)

NF: 当前的字段()个数(有多少列)

-F “#” 表示将每一个域(每一列)之间的分隔符(空格)用#代替这样更加直观

Z.B:awk -F “#” ‘{drucken $0}’ nginx.conf 打印出nginx.conf中的每一条记录(每一行)

的所有字段(每一行的所有列)并将每一列之间的分隔符(空格)用#代替

awk ‘{drucken $0}’ myfile 打印出myfile中所有的记录(行)

$0就是整条记录 ,$1是记录的第1个字段,$2是记录的第2个字段,$3是记录的第3个字段以此类推

但不要和shell中的$混淆

Z.B:awk -F “#” ‘{print NF,NR,$0}’ nginx.conf 打印出nginx.conf中的每一条记录(每一行)

的所有字段(每一行的所有列)并将每一列之间的分隔符(空格)用#代替同时统计每一条记录所在的行号

每一条记录有多少个字段(列)

那么打印出的顺序为

此记录有多少个字段(NF) 此记录在第几行 (NR) 记录内容($0)(字段1#字段2)

此记录有多少个字段(NF) 此记录在第几行 (NR) 记录内容($0)(字段1#字段2)

此记录有多少个字段(NF) 此记录在第几行 (NR) 记录内容($0)(字段1#字段2)

awk中特殊的元字符: + ,? +表示匹配任意字符?表示匹配任意字符

匹配操作符~!~其中~表示匹配!~表示不匹配后面跟上匹配或不匹配的内容内容用//括起来

Z.B:

cat score.txt | awk ‘$0~/218.79.131.96/先输出score.txt的内容再找出带有IP 218.79.131.96的整条记录

cat score.txt | awk ‘$0!~/218.79.131.96/先输出score.txt的内容再过滤带有IP 218.79.131.96的整条记录

awk ‘{wenn($1==”218.79.131.96″) printf $0}’ score.txt 在文件sorce.txt中

如果某条记录的第1个字段匹配218.79.131.96那么就输出包含这个记录的整个字段

awk所有的操作都在引号之间

awk的大体格式

awk ‘{123}{345}{345}{456}’ file 大括号之间没有空格

 

实时打印nginx的access日志里访问的IP地址用-作为分隔符

tail -f /var/log/nginx/access.log | awk -F- ‘{drucken $1}’

[root@app01 ~]# mit der Warnung | grep -v Linux | mit der Warnung | head -5

有文本如下a.txtawk ,取第3行 第3列的值
01:34:14 PM 2 16.13 0.00 0.81 0.01 0.00 0.24 0.00 0.00 82.82
01:34:14 PM 1 11.65 0.00 0.63 0.00 0.00 0.15 0.00 0.00 87.58
01:34:14 PM 3 11.59 0.00 0.64 0.00 0.00 0.11 0.00 0.00 87.66
01:34:14 PM 18 7.82 0.00 0.36 0.00 0.00 0.00 0.00 0.00 91.82
01:34:14 PM 16 7.21 0.00 0.41 0.00 0.00 0.02 0.00 0.00 92.36

[root@app01 ~]# cat a.txt |awk ‘NR==3{drucken $3}’
3

 

 

Hinterlasse eine Antwort