https://www.jianshu.com/p/d54e0359db01
AWK是一个优良的文本处理工具,Linux和Unix环境中现有的功能最强大的数据处理引擎之一。
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
awk 命令行
你可以象使用普通UNIX 命令一样使用awk,在命令行中你也可以使用awk 程序设计语言,,这种方法一般只用于解决简单的问题。当然,你也可以在shell script 程序中引用awk 命令行甚至awk 程序脚本。
使用-f 选项调用awk 程序
awk 允许将一段awk 程序写入一个文本文件,然后在awk 命令行中用-f 选项调用并执行这段程序。
利用命令解释器调用awk 程序
利用UNIX 支持的命令解释器功能,我们可以将一段awk 程序写入文本文件,然后在它的第一行加上#!/bin/awk –f。
FILENAME:awk浏览的文件名
FNR:awk浏览的文件的记录数
FS:设置输入域的分隔符
NF:浏览域的个数
NR:已读的记录数
OFS:输出域分隔符
ORS:输出记录分隔符
RS:控制记录分隔符
$0:指整条记录
$1:第一个作用域及第一列
~:匹配,与==相比不是精确比较
!~:不匹配,不精确比较
==:等于,必须全部相等,精确比较
!=:不等于,精确比较
&&:逻辑与
||:逻辑或
+:匹配时表示1个或1个以上
/[0-9][0-9]+/:两个或两个以上数字
/[0-9][0-9]*/:一个或一个以上数字
过滤/etc/passwd文件,以冒号为分隔符,过滤出第一列
awk -F ':' '{print $1}' /etc/passwd
统计/etc/passwd文件中,一共有多少个用户
awk '{count++;print $0;} END {print "user count is:",count} ' /etc/passwd
统计/etc/passwd文件,打印出文件名,已读的记录数,以冒号为分隔符,每行浏览域的个数,每行记录的内容
awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF, ",linecontent:" $0}' /etc/passwd
统计/etc/passwd文件,从0开始,依次往下浏览,一直到最后并打印出循环了多少次
awk 'BEGIN {count=0;print "start use count is:",count} {count++;print $0;} END {print "user count is:",count} ' /etc/passwd
统计当前目录下,所有文件总大小,并输出到all file siz is
ll |awk 'BEGIN {size=0} {size=size+$5} END {print "all file size is:",size}'
统计当前目录下,除去4096大小的文件外,所有文件大小的总和,输出到all file siz is
ll |awk 'BEGIN {size=0} {if ($5 !=4096) size=size+$5} END {print "all file size is:",size}'
统计/etc/passwd文件,在每行行首从0开始记录浏览行数
awk -F ':' 'BEGIN {null=0} {name[null]=$1;null++} END {for(i=0;i<NR;i++) print i,name[i]}' /etc/passwd
统计netstat -anp 状态为LISTEN和CONNECT的连接数量分别是多少
netstat -anp|awk '$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (i in sum) printf "%-10s %-6s %-3s \n", i," ",sum[i]}'
计算/home目录下,普通文件的大小,使用KB作为单位
ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",sum/1024,"KB"}'
ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",int(sum/1024),"KB"}' //int是取整的意思
统计/home目录下不同用户的普通文件的总数是多少?
ls -l|awk 'NR!=1 && !/^d/{sum[$3]++} END{for (i in sum) printf "%-6s %-5s %-3s \n",i," ",sum[i]}'
mysql 199
root 374
统计/home目录下不同用户的普通文件的大小总size是多少?
ls -l|awk 'NR!=1 && !/^d/{sum[$3]+=$5} END{for (i in sum) printf "%-6s %-5s %-3s %-2s \n",i," ",sum[i]/1024/1024,"MB"}'
SED即Stream Editor文本流编辑,是一个“非交互式”面向字符流的编辑器。能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上。还可以对原文件改动,但是不会再屏幕上返回结果。
sed [options] 'command' file(s)
或者
sed [options] -f scriptfile file(s)
-e :直接在命令行模式上进行sed动作编辑,此为默认选项;
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;
-i :直接修改文件内容;
-n :只打印模式匹配的行;
-r :支持扩展表达式;
-h或--help:显示帮助;
-V或--version:显示版本信息;
-a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行);
-c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行;
-d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
-i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
-p ∶列印,亦即将某个选择的资料印出;通常 p 会与参数 sed -n 一起运作;
-s ∶取代,可以直接进行取代的工作哩;通常这个 s 的动作可以搭配正规表示法;
a\\ 在当前行下面插入文本。
i\\ 在当前行上面插入文本。
c\\ 把选定的行改为新的文本。
d 删除,删除选择的行。
D 删除模板块的第一行。
s 替换指定字符
h 拷贝模板块的内容到内存中的缓冲区。
H 追加模板块的内容到内存中的缓冲区。
g 获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l 列表不能打印字符的清单。
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p 打印模板块的行。
P(大写) 打印模板块的第一行。
q 退出Sed。
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
r file 从file中读行。
t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file 写并追加模板块到file末尾。
W file 写并追加模板块的第一行到file末尾。
! 表示后面的命令对所有没有被选定的行发生作用。
= 打印当前行号码。
'#' 把注释扩展到下一个换行符以前。
g 表示行内全面替换。
p 表示打印行。
w 表示把行写入一个文件。
x 表示互换模板块中的文本和缓冲区中的文本。
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\\1 子串匹配标记
& 已匹配字符串标记
^ 匹配行开始,如:/^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的行。
sed '5 q' /etc/passwd #打印前5行
sed -n '/r*t/p' /etc/passwd #打印匹配r有0个或者多个,后接一个t字符的行
sed -n '/.r.*/p' /etc/passwd #打印匹配有r的行并且r后面跟任意字符
sed -n '/o*/p' /etc/passwd #打印o字符重复任意次
sed -n '/o\{1,\}/p' /etc/passwd #打印o字重复出现一次以上
sed -n '/o\{1,3\}/p' /etc/passwd #打印o字重复出现一次到三次之间以上
cat file.txt
Python
Django
Flask
Hello World
1. 匹配字符行的行首添加
sed '/Python/s/^/Lain /' file.txt
Lain Python
Django
Flask
Hello World
2. 匹配字符行的行尾添加
sed 's/Python/& Lain/' file.txt
Python Lain
Django
Flask
Hello World
3. 匹配字符前添加
sed 's/World/Lain &/' file.txt
Python
Django
Flask
Hello Lain World
4. 匹配字符后添加
sed 's/World/& Lain/' file.txt
Python
Django
Flask
Hello World Lain
5. 匹配行的上一行添加
sed '/Flask/i\HTML' file.txt
或者
sed '/Flask/i HTML' file.txt
Python
Django
HTML
Flask
Hello World
6. 匹配行的下一行添加
sed '/Flask/a HTML' file.txt
或者
sed '/Flask/a\HTML' file.txt
Python
Django
Flask
HTML
Hello World
7. 所有行行首添加
sed 's/^/Lain /g' file.txt
或者
sed 's/^/Lain /' file.txt
Lain Python
Lain Django
Lain Flask
Lain Hello World
8. 所有行行尾添加
sed 's/$/ Lain/' file.txt
或者
sed 's/$/ Lain/g' file.txt
Python Lain
Django Lain
Flask Lain
Hello World Lain
9.指定行添加内容
sed '1,2s/$/ Lain/g' file.txt #1,2行行尾添加
sed '1,2s/^/# /' file.txt #1,2行行首添加
cat file.txt
#Python web
#Django web
Flask web
Hello World web
JavaScript
PHP Nginx
1. 删除行首是'#'的行
sed '/^#/d' file.txt
Flask web
Hello World web
JavaScript
PHP Nginx
2. 删除行首不是'#'的行
sed '/^#/!d' file.txt
#Python web
#Django web
3. 删除行
sed '1d' file.txt #删除第一行
sed '$d' file.txt #删除最后一行
sed '1,2d' file.txt #删除指定行
4. 删除匹配字符所在的行
sed '/Hello/d' file.txt
#Python web
#Django web
Flask web
JavaScript
PHP Nginx
cat file.txt
#Python web
#Django web
Flask web
Hello World web
JavaScript
PHP Nginx
1. 更换匹配字符所在行
sed '/Flask/c\LAIN' file.txt
#Python web
#Django web
LAIN
Hello World web
JavaScript
PHP Nginx
2. 更换文件中所有匹配字符
sed 's/web/core/' file.txt
#Python core
#Django core
Flask core
Hello World core
JavaScript
PHP Nginx
3. 更换匹配字符所在行的关键字
sed '/Flask/s@web@core@' file.txt
或者
sed '/Flask/s#web#core#' file.txt
#Python web
#Django web
Flask core
Hello World web
JavaScript
PHP Nginx
4. 替换匹配关键字所在行的'#'
sed '/web/s/#//' file.txt
Python web
Django web
Flask web
Hello World web
JavaScript
PHP Nginx
GREP(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
grep的工作方式,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
grep [OPTION]... PATTERN [FILE]...
-E, --extended-regexp 扩展正则表达式egrep
-F, --fixed-strings 一个换行符分隔的字符串的集合fgrep
-G, --basic-regexp 基本正则
-P, --perl-regexp 调用的perl正则
-e, --regexp=PATTERN 后面根正则模式,默认无
-f, --file=FILE 从文件中获得匹配模式
-i, --ignore-case 不区分大小写
-w, --word-regexp 匹配整个单词
-x, --line-regexp 匹配整行
-z, --null-data 一个 0 字节的数据行,但不是空行
-s, --no-messages 不显示错误信息
-v, --invert-match 显示不匹配的行
-V, --version 显示版本号
--help 显示帮助信息
--mmap use memory-mapped input if possible
输入控制:
-m, --max-count=NUM 匹配的最大数
-b, --byte-offset 打印匹配行前面打印该行所在的块号码。
-n, --line-number 显示的加上匹配所在的行号
--line-buffered 刷新输出每一行
-H, --with-filename 当搜索多个文件时,显示匹配文件名前缀
-h, --no-filename 当搜索多个文件时,不显示匹配文件名前缀
--label=LABEL print LABEL as filename for standard input
-o, --only-matching 只显示一行中匹配PATTERN 的部分
-q, --quiet, --silent 不显示任何东西
--binary-files=TYPE 假定二进制文件的TYPE 类型;TYPE 可以是`binary', `text', 或`without-match'
-a, --text 匹配二进制的东西
-I 不匹配二进制的东西
-d, --directories=ACTION 目录操作,读取,递归,跳过
-D, --devices=ACTION 设置对设备,FIFO,管道的操作,读取,跳过
-R, -r, --recursive 递归调用
--include=PATTERN 只查找匹配FILE_PATTERN 的文件
--exclude=PATTERN 跳过匹配FILE_PATTERN 的文件和目录
--exclude-from=FILE 跳过所有除FILE 以外的文件
-L, --files-without-match 匹配多个文件时,显示不匹配的文件名
-l, --files-with-matches 匹配多个文件时,显示匹配的文件名
-c, --count 显示匹配了多少次
-Z, --null 在FILE 文件最后打印空字符
文件控制:
-B, --before-context=NUM 打印匹配本身以及前面的几个行由NUM控制
-A, --after-context=NUM 打印匹配本身以及随后的几个行由NUM控制
-C, --context=NUM 打印匹配本身以及随后,前面的几个行由NUM控制
-NUM 根-C的用法一样的
--color[=WHEN],
--colour[=WHEN] 使用标志高亮匹配字串;
-U, --binary 使用标志高亮匹配字串;
-u, --unix-byte-offsets 当CR 字符不存在,报告字节偏移(MSDOS 模式)
- 测试文件
cat test.txt
systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:997:995:User for polkitd:/:/sbin/nologin
colord:x:996:994:User for colord:/var/lib/colord:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
unbound:x:995:993:Unbound DNS resolver:/etc/unbound:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
saslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologin
libstoragemgmt:x:993:990:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
geoclue:x:992:989:User for geoclue:/var/lib/geoclue:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
setroubleshoot:x:991:988::/var/lib/setroubleshoot:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs