目录
一、文本三剑客
1.awk 文本截取
awk是一组编程语言,gawk - pattern scanning and processing language,打印匹配扫描和处理语言的行 。
1.用途
awk可用于过滤、截取、统计
2.完整语法
awk ‘BEGIN(commands)pattern{commands}END{commands}’ file1
3.分隔符
awk的默认分隔符是空白,分隔符分为输入分隔符和输出分隔符。
① 输入分隔符:
- 默认为空白(空格和tab键)
- -F 指定分隔符
- FS 输入分隔符变量
② 输出分隔符:
- 默认为一个空格
- OFS=" " 输出分隔符变量( output field separator)
③ 举例
以 /etc/passwd 文件为例,注意要修改重要文件一定要记得备份~~
- -F 和 OFS
1、-F
[root@zabbix linux-test]# awk -F: '{print $1,$7}' /etc/passwd |head
root /bin/bash
root /bin/bash
bin /sbin/nologin
bin /sbin/nologin
daemon /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
lp /sbin/nologin
2、OFS
[root@zabbix linux-test]# awk -F: 'OFS="#"{print $1, $3,$7}' /etc/passwd
root#0#/bin/bash
root#0#/bin/bash
bin#1#/sbin/nologin
bin#1#/sbin/nologin
......
3.原passwd文件
[root@zabbix linux-test]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
......
命令解析:
1. awk -F: '{print $1,$7}' /etc/passwd |head
指定 “:” 为分隔符 ,取第一列和第七列,head默认取前10行。
2. awk -F: 'OFS="#"{print $1, $3,$7}' /etc/passwd
以分号为分隔符,截取第1,3,7列,并且指定输出的分隔符为 #。
4.内置变量
- OFS 输出分隔符变量 output field separator
- FS 输入分隔符变量 input field separator
- NF 每行$0的字段数 number field
- NR 当前处理的行号
使用:
1、显示passwd文件的第5行和第10行的行号和用户名
[root@nginx-kafka01 linux-text]# awk -F':' 'NR==5 ||NR==10{print NR,$1}' /etc/passwd
5 daemon
10 lp
2.
[root@nginx-kafka01 linux-text]# awk -F: 'BEGIN{num=0;print "start"}$1 ~/^chen/&&$3>2000 ||$NF ~ /bash/ {print NR, NF, $1, $3, $(NF-1),$NF;num++}END{print "行数:"num}' /etc/passwd
start
1 7 root 0 /root /bin/bash
2 7 root 0 /root /bin/bash
41 7 chenyulin 1000 /home/chenyulin /bin/bash
42 7 chenyulin 1000 /home/chenyulin /bin/bash
43 7 echo 1001 /home/echo /bin/bas
.......
行数:36
5.流控
① if
语法:if (condition) statement1
单分支:
[root@zabbix linux-test]# awk -F: '{if($1 ~ /chen/)print "chenjie";else print "ge" }' /etc/passwd
ge
ge
......
chenjie
chenjie
.....
命令解析:
awk -F: '{if($1 ~ /chen/)print "chenjie";else print "ge" }' /etc/passwd
在 /etc/passwd 内寻找chen 如果找到了陈输出chenjie,否则就输出ge。
多分支:
[root@zabbix linux-test]# awk -F: '{if ($3==0) {num++;print $1"是超级用户"} else if ($3>1&& $3<1000) num2++;else num3++}END{print "超级用户的数量是:"num,"系统用户的数量是:"unm2, "普通用户的数量是:"num3}' /etc/passwd
root是超级用户
root是超级用户
超级用户的数量是:2 系统用户的数量是: 普通用户的数量是:38
命令解析:
在 passwd 文件里面,对$3(第三列)进行判断,如果等于0就是超级用户,在3~1000之间就是系统用户,否则就是普通用户,在里面定义了三个变量,分别对三个判断的数量进行计数。
② for
语法:for (i in array){print array[i]} 或者 for (i=0;i<10;i++){print $i}
1、
[root@zabbix ~]# awk -F: '{split($6,home,"/");for (i in home)print i,home[i]}' /etc/passwd
1
2 home
3 zhao
1
2 home
3 feng
1
2 home
3 feng
2、
[root@zabbix ~]# awk -F: '{split($6,home,"/");for (i=2;i<4;i++)print i,home[i]}' /etc/passwd
2 home
3 zhao
2 home
3 zhao
2 home
3 feng
2 home
3 feng
命令解析:
1、这两条命令都使用了split函数进行分割,split的用法 split(s, a [, r [, seps] ]),第一个命令是以“:”为分隔符,截取$6,$6再使用split将$6进行分割,分割成home和分隔符“/”,再进行循环i在home里面就打印出home。
2、这条命令与第一条差不多,解释参考第一条命令。
6.函数
常用的函数有下列几个:
- length 统计长度
- spilt 切割
- gsub 替换
- toupper 大写
- tolower 小写
- subst 截取
- system 批量使用命令
用法:
1、gsub 替换
[root@nginx-kafka01 linux-test]# cat 000
cc/jj/yy/bb/123/456
[root@nginx-kafka01 linux-test]# awk '{gsub("/"," ",$0);print $0}' 000
cc jj yy bb 123 456
·····将 / 用 空格 代替
2、toupper 大写 和 tolower 小写
[root@nginx-kafka01 linux-test]# awk -F: '{print toupper($1)}' passwd
ROOT
BIN
DAEMON
[root@nginx-kafka01 linux-test]# awk -F: '{print tolower($1)}' passwd
root
bin
daemon
adm
lp
sync
3、subst 截取 和 length
[root@nginx-kafka01 linux-test]# awk -F: 'length($1) >1 {print substr($1,1,5)}' passwd
root
bin
daemo
adm
lp
5、system 批量使用命令
awk '{system("useradd" $1)}' name.text
将name.text内的用户名,每个都新建一个用户,useradd
7.数组
1、参考5.流控的② for
8.求和 和 统计
这个将是一个题来说明。
① 统计账单,在bill.txt内存放了多个人的多笔账单,请将每个人的账单统计出来,并输出每个人的总账单。
[root@nginx-kafka01 linux-text]# cat bill.txt
feng 100
feng 200
feng 350
li 200
li 239
li 890
zhang 100
zhang 350
[root@nginx-kafka01 linux-text]# awk '{name[$1]+=$2}END{for (i in name) print i,name[i]}' bill.txt
li 1329
feng 650
zhang 450
name[$1] 拿$1做字段key 让$2做value, 如果这个数组里面有key,就累加,初始值是0+value,END是文件里所有的行都处理完了,最后去执行end部分的命令,end里面的只执行一次 。
② 统计各个省份的票数,输出省份和总票数,按照降序排列
[root@nginx-kafka01 linux-text]# cat prov.txt
山东 aa 2
河南 bb 3
江西 cc 3
湖南 aa 40
山东 bb 10
江西 dd 6
河南 cc 3
湖南 cc 3
[root@nginx-kafka01 linux-text]# awk '{pro[$1]+=$3}END{for (i in pro) print i,pro[i]}' prov.txt |sort -k2 -nr
湖南 43
山东 12
江西 9
河南 6
2.grep 文本过滤
grep, egrep, fgrep - print lines matching a pattern,grep, egrep, fgrep打印匹配模的行。
1、用途
在文件中查找并显示包含指定字符串的行
2、语法
grep [OPTIONS] PATTERN [FILE...]
grep 选项 模式 文件
3、常用选项
- -i:查找时忽略大小写
- -v:反转查找,输出与模式不相符的行
- -n:显示符合模式要求的行号
- -r:递归搜索所有文件
- -o:只显示匹配的内容
- -E:支持扩展正则
- -A: 找到匹配行以及后几行
- -B:输出匹配行以及前几行
4、用法
① -E 和 -o 和 -v
1.egrep
[root@nginx-kafka01 linux-text]# egrep -o ^root /etc/passwd
root
root
[root@nginx-kafka01 linux-text]# egrep -v ^root /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
命令解析:
egrep相当于grep -E 支持扩展正则,-o只会输出你所匹配到的,不匹配的不输出。
② -A 和 -B
[root@nginx-kafka01 linux-text]# egrep -A2 chen grade.tex
2 chen 90 89 98//100
3 yang 40 99 100//69
4 liu 89 38 37//45
[root@nginx-kafka01 linux-text]# egrep -B2 chen grade.tex
id name chinese math english//linux
1 cail 80 20 90//90
2 chen 90 89 98//100
③ -n 和 -i
1.-n 和 -i
[root@nginx-kafka01 linux-text]# egrep -ni hunan prov.txt
9:HUNAN cc e
10:hunan yy 6
11:HunaN qq 9
[root@nginx-kafka01 linux-text]# cat prov.txt
HUNAN cc e
hunan yy 6
HunaN qq 9
3.sed 文本替换
sed - stream editor for filtering and transforming text,用于过滤和转换文本的流编辑器。
1、用途
文本替换
2、语法
sed [OPTION]... {script-only-if-no-other-script} [input-file]
3、常见参数
- -n 仅显示匹配的行(--quiet或--silent)
- -i 直接对文件编辑匹配的位置
- -r 可以根据行号和模式匹配进行操作
- -e 以选项中指定的script来处理输入的文本文件
- -f 以选项中指定的script文件来处理输入的文本文件
4、动作
- a 追加,末尾追加
- c 整行替换
- d 删除
- i 插入,前插入
- p 打印
- s 局部替换
- g 全部替换(一篇文章里面匹配到的全部替换)
5、使用
参数与动作可以结合使用。
① -n
1.
[root@nginx-kafka01 linux-text]# sed -n '1,5p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
2.
[root@nginx-kafka01 linux-text]# sed -n '1p;5p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
命令解析:
第一条命令是,sed取出/etc/passwd文件的第1行到5行,第二条命令是,sed取出/etc/passwd文件的第1和5第行,要执行两条命令记得要加个“;”(分号)进行分隔。
② 参数-i 与动作 s 结合使用
s的使用为s/旧/新/,旧:是想要被替换的,新:是想要替换成什么。
[root@nginx-kafka01 linux-test]# cat ifcfg-ens33
TYPE="Ethernet"
BOOTPROTO="static"
ONBOOT="yes"
[root@nginx-kafka01 linux-test]# sed -i '/^ONBOOT/ s/yes/no/' ifcfg-ens33
[root@nginx-kafka01 linux-test]# cat ifcfg-ens33
TYPE="Ethernet"
BOOTPROTO="static"
ONBOOT="no"
命令解析:
在ifcfg-ens33文件内,将/etc/sysconfig/network-scripts/ifcfg-ens33里的ONBOOT=yes修改为no,s为局部替换,假如在一篇文章内有很多个ONBOOT,它只会将匹配到的第一个进行修改。
写法二:
[root@nginx-kafka01 linux-test]# cat cc.txt
feng luo zhao chcen chen luo
cail feng luo li
feng luo zhao chcen li
chen
[root@nginx-kafka01 linux-test]# sed -i '/^feng/ s/luo/Lin/2' cc.txt
[root@nginx-kafka01 linux-test]# cat cc.txt
feng luo zhao chcen chen Lin
cail feng luo li
feng luo zhao chcen li
chen
命令解析:
在cc.txt文件内,查找以feng开头的行,将这行的第二个luo替换成Lin。
④ -r
[root@nginx-kafka01 linux-test]# echo aaa bbb ccc|sed -r 's/([a-z]+) ([a-z]+) ([a-z]+)/\3 \2 \1/'
ccc bbb aaa
命令解析:
s的使用为s/旧/新/,/([a-z]+) ([a-z]+) ([a-z]+)/为在echo处匹配到的,位置分别为123,/\3 \2 \1/ 是将前面的位置变成321 “\”为转义字符,可以让其后面的内容原样输出。
6、&
在sed内&可以理解为一个指针,指针指到谁,就用谁。
举例:
[root@nginx-kafka01 linux-test]# echo 'i have a fat cat'|sed -n 's/.at/"&"/gp'
i have a "fat" "cat"
命令解析:
在echo内匹配 .at 将匹配到的内容交给&,再在&处进行处理,结果为给匹配到的内容加上引号。
7、sed里单引号和双引号的区别
双引号里可以使用shel里的变量,单引号不行,单引号和双引号里都可以存放模式。
二、其他文本命令
1.tr 命令
tr - translate or delete characters
1、用途
字符转换和删除的命令
2、用法
tr [OPTION]... SET1 [SET2]
3、参数
- -s 压缩连续相同的字符串成一个字符
- -d 删除字符串
4、用法
[root@nginx-kafka01 linux-test]# echo aaaaaa|tr -s a
a
[root@nginx-kafka01 linux-test]# echo aavvdd1234|tr av 89
8899dd1234
2.tail
tail - output the last part of files
1、用途
命令可用于查看文件的内容
2、用法
tail [OPTION]... [FILE]...
3、参数
- -f 循环读取
- -q 不显示处理信息
- -v 显示详细的处理信息
- -c<数目> 显示的字节数
- -n<行数> 显示文件的尾部 n 行内容
- --pid=PID 与-f合用,表示在进程ID,PID死掉之后结束
4、使用
tail -f = tailf
1、取/etc/passwd 内的最后三行
[root@nginx-kafka01 linux-test]# tail -3 /etc/passwd
zhao:x:1016:1016::/home/zhao:/bin/bash
feng:x:1017:1017::/home/feng:/bin/bash
feng:x:1017:1017::/home/feng:/bin/bash
[root@nginx-kafka01 linux-test]# tail -n3 /etc/passwd
zhao:x:1016:1016::/home/zhao:/bin/bash
feng:x:1017:1017::/home/feng:/bin/bash
feng:x:1017:1017::/home/feng:/bin/bash
2、取从第3行开始直到末行
[root@nginx-kafka01 linux-test]# tail -n +3 /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
......
3.head
head - output the first part of files
1、用途
Print the first 10 lines of each FILE to standard output. With more than one FILE, precede each with a header giving the file name. With no FILE, or when FILE is -, read standard input.
将每个FILE的前10行打印到标准输出。 如果有多个FILE,则在每个FILE之前带有给出文件名的头。 如果没有FILE,或者FILE为-,读取标准输入。
2、语法
head [OPTION]... [FILE]...
3、参数
- -q 隐藏文件名
- -v 显示文件名
- -c<数目> 显示的字节数
- -n<行数> 显示的行数
4、用法
head默认取钱10行。
取前两行
[root@nginx-kafka01 linux-test]# head -2 passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
4.cat
cat - concatenate files and print on the standard output
1、用途
Concatenate FILE(s), or standard input, to standard output.
将文件(或标准输入)连接到标准输出
2、语法
cat [OPTION]... [FILE]...
3、参数
- -n 或 --number:由 1 开始对所有输出的行数编号
- -b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号
- -s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行
4、用法
[root@nginx-kafka01 linux-test]# cat >a.txt<<EOF
> sanchuang
> as
> EOF
[root@localhost lianxi]# cat a.txt
sanchuang
as
遇到EOF退出,EOF不固定可以定义为任何字母
[root@nginx-kafka01 linux-test]# cat -n passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5.more
more - file perusal filter for crt viewing,More是一个每次一屏一屏地翻页文本的过滤器
1、用途
全屏方式分页显示文件内容
2、语法
more [options] file [...]
3、参数
- -d 显示帮助,而不是响铃
- -f 统计逻辑行数而不是屏幕行数
- -l 抑制换页(form feed)后的暂停
- -p 不滚屏,清屏并显示文本
- -c 不滚屏,显示文本并清理行尾
- -u 抑制下划线
- -s 将多个空行压缩为一行
- -NUM 指定每屏显示的行数为 NUM
- +NUM 从文件第 NUM 行开始显示
- +/STRING 从匹配搜索字符串 STRING 的文件位置开始显示
- -V 输出版本信息并退出
4、用法
分页显示文件内容,按回车 一行一行显示,按空格显示下一页,按b返回上一页,按q退出,放完会自动退出。
6.less
less - opposite of more
1、用途
Less是一个类似于more(1)的程序,但它也允许在文件中向后移动向前运动的方向。
2、用法
跟more差不多