文本三剑客

sort排序

sort 以行为单位,对文件的内容进行排序

sort 选项 参数

sort 123.txt

cat file | sort 选项

cat xy103.txt | sort -f

​ -f 忽略大小写,但是默认会把大写字母放在前面

sort -f xy103.txt

​ -b 忽略每行之前的空格(不是删除空格,而是依然按照数字和字母的顺序配列)

sort -b xy103.txt

​ -n 按照数字进行排序

sort -n xy103.txt	

​ -r 根据第一个数字先进行倒排序,后排字母

sort -r xy102.txt

​ -u 去重相同的数据只显示一行

sort -u xy102.txt

​ -o 把排序后的结果转存到指定的文件

sort xy102.txt -o xy103.txt

cat -n /etc/xy102.txt | sort -rno xy103.txt 

uniq去重

uniq 去除连续重复的行,只显示一行

​ -c 去除连续重复的行次数

uniq -c xy103.txt

​ -u 显示仅出现一次的行

uniq -u xy103.txt

​ -d 仅显示连续重复的行(不包括非连续出现的内容)

uniq -d xy103.txt

tr

tr 用来对标准输出的字符进行替换,压缩和删除

-c 保留字符集1的字符,其他的字符用字符集2来进行替换

echo abc | tr -c 'ab' 'a'	保留了ab,替换了c为a

-d 删除字符集中的一部分

echo abc | tr -d 'ab'	删除了ab,只会显示c

-s 替换,把字符集1的部分替换成字符集2的部分|连续重复出现的字符压缩成一个

echo abc | tr -s 'a'	连续重复的a压缩成一个a
echo abc | tr -s ':' ';' 把原来的字符串替换成其他的
cat /etc/passwd|tr -s ':' ';'

cut

cut 对字段进行截取和裁剪

-d 指定分隔符(默认的分隔符是tab键)

-f 对字段进行截取,指定输出段的内容

cut -d ':' -f 1-3 /etc/passwd
以:为分隔符的,截取1到3的内容,不是1和3

-b 以字节来进行截取 了解即可

-c 以字符来进行截取 了解即可

-complement 输出的时候排除指定的字段

head -n 1 /etc/passwd | cut -d ':' -f 1-3 /etc/passwd | cut -d ":" --complement -f 2

-output-delimiter 更改输出内容的分隔符

head -n 1 /etc/passwd | cut -d ':' -f 1-3 --output-delimiter='@'

split

split 大文件拆分成若干小份的文件

-l 安行来进行分割

split -l 20 test2.txt xy102	对文件进行20行的标准分割成以xy102开头的aa ab ac文件

-b 按照大小来进行分割

split -b 1024k nginx-1.22.0.tar.gz nginx-1.22.0.tar.gz

-b 1024g
-b 1024m
-b 1024k
-b 1024b

curl

获取和发送数据

获取网页内容并且输出

-O 下载文件到本地

-o 将文件下载到指定的路径

-x 发送post请求

-i 获取web软件的版本(服务端没有隐藏版本号)

curl 192.168.118.10

curl www.baidu.com

面试题:

现在有一个日志文件,很大,有5个G

第一个能不能快速打开?

1.-l按行分

2.-b按文件大小拆分

这里推荐split -b 按文件大小拆分

面试题

cat合并与paste文件合并区别是什么

cat test1.txt test2.txt > test3.txt	上下合并
paste test1.txt test2.txt > test3.txt 左右合并

综合面试题

统计当前主机的连接状态

netstat -antp

ss -antp | grep -v '^State'|cut -d ' ' -f 1| sort | uniq -c 

文本三剑客

grep

grep的作用就是使用正则表达式来匹配文本内容

​ -m 匹配几次之后停止

grep -m 1 root /etc/passwd

​ -v 取反

grep -v root /etc/passwd	

​ -n 显示匹配内容以及内容行号

grep -n root /etc/passwd

​ -c 显示统计匹配的行数

grep -c root /etc/passwd

​ -o 查找什么就单独只显示什么,所在行其他内容不显示

grep -o root /etc/passwd	

​ -q 不显示

grep -q root /etc/passwd

​ -e 逻辑或,只要包含了就会显示所在行

grep -e root /etc/passwd	

​ -A 匹配到当前的行以及后面的3行

grep -A 3 root /etc/passwd 

​ -B 匹配到当前的行以及前面的3行

grep -B 3 dn /etc/passwd

​ -C 匹配到当前的行以及后前各3行

grep -C 3 dn /etc/passwd	

​ -E 匹配扩展正则表达式

grep -E 3 dn /etc/passwd

​ -f 匹配两个文件相同的内容为准,以第一个文件为准

grep -f /etc/123.txt /etc/passwd	

​ -r 递归匹配目录下的文件包含的内容(不对软连接起效)

grep -r 123 /root/123.txt		

​ -R 递归匹配目录下的文件包含的内容,对软连接也起效

grep -R 123 /root/999.tx	

sed

grep就是查找文本当中的内容,扩展正则表达式

sed文本三剑客之二

sed是一种流编辑器,也是按行处理,一次处理一行内容.

如果只是展示,会放在缓冲区(模式空间),展示结束之后,会从模式空间把操作结果删除.

一行一行处理,处理完当前这行,才会处理下一行,直到文件末位.

sed的命令格式

sed - e '操作符' -e '操作符' 文件1 文件2
#-e表示可以跟多个操作符,只有一个操作符,-e可以省略
sed -e '操作符1:操作符2' 文件1 文件2

选项

-n	仅显示script处理后的结果(不加-n,sed会有两个输出结果,加了-n之后,就会把默认输出屏蔽,仅显示一个结果)
-e	用于执行多个操作命令
-f	在脚本中第一好了操作符,然后根据脚本内容的操作符对文件进行操作
-i	直接修改目标文件(慎用)
-r	使用拓展正则

操作符

p	打印结果
r	使用扩展正则表达式
s	替换,替换字符串
c	替换,替换指定行
y	替换,替换单个字符,如果多个字符替换,必须和替换内容的字符长度保持一致
d	删除,删除行
a	增加,在指定行的下一行插入内容
i	增加,在指定行的上一行插入内容
r	在行后增加文本内容
$a	最后一行插入新的内容
$i	倒数第二行插入新的内容
$r	读取其他文件的内容,插入到对象文件的最后一行

sed增加 i a r $i $a $r

sed '1i 000' testone			按行,指定在第一行的上一行添加000
sed '/ten/i onetentwo' test.txt	按行的内容,指定在ten的上一行添加onetentwo

sed '1a 111' testone			按行,指定在第一行的下一行添加111
sed '/ten/a onetenone' test.txt	按行的内容,指定在ten的下一行追加onetenone


sed '/ten/r xy102.txt' test.txt	按行的内容在ten的下一行追加xy102的内容

sed '$i onetenone' test.txt		按行,指定在test.txt文件内容的倒数第二行插入onetenone

sed '$a onetenone' test.txt		按行,在test.txt文件的最后一行插入

sed '$r xy102.txt' test.txt		在test.txt中插入xy102.txt的内容	

对文本内容删除 d

sed '/222/d' testone	按内容,会把文件中所有包含了内容有222的行删除

sed '3d' test.txt 		按行,删除第三行

sed '5,$d' test.txt 	按行,删除5到最后一行

sed '1!d' test.txt 		按行,删除除了第一行之外的行

sed '4,6!d' test.txt 除了第四行到第六行,其他的全部删除

按行 匹配字符串删除行
sed '/o/d' test.txt	删除包含0的行
sed '/one/,/six/d' test.txt 删除包含one到six的行
sed '/o/!d' test.txt	删除所有不包含o的行

如何免交互删除空行三种方式
grep -v '^$' test.txt	(输出)删除空行
cat test.txt|tr -s '\n' (输出)删除空行
sed '/^$/d' test.txt	(删除)空行

sed的替换 s c y

sed 's/root/test/p' test.txt 替换每行中的第一个发现的root
sed 's/root/test/gp' test.txt 把所有的root替换成test
sed 's/^/#/p' test.txt			
sed '4 s/^/#/p' test.txt
sed '4,5 s/^/#/p' test.txt
sed '4 s/^/#/p' test.txt

首字母替换成大写
sed 's/[a-z]/\u&/' test.txt		\u&	转换首字母大写的特殊符号,\是转义符
sed 's/[a-z]/\u&/g' test.txt	g是所有变成大写

sed 's/[A-Z]/\l&/g' test.txt	\l&是大写转小写的特殊字符,\转义符
cat /etc/xinetd.d/tftp |sed 's/yes/no/'

整行替换
sed '/one/c dn zhzhang de shuai' test.txt
单字符替换 y
sed 'y/one/111/' test.txt	单字符替换

默认打印功能

sed -n 'p' sed.txt
sed ' ' sed.txt

寻址打印

按照指定的行进行打印 p

sed -n '=' test.txt	只显示行号	=行号

sed -n '=;p' test.txt	既显示行号又显示内容

sed -n '=;4p' sed.txt 打印第四行的内容

cat -n test.txt | sed -n '4p'	好看一点

sed -n '$p' test.txt	打印最后一行

sed -n '2,4p' test.txt	2到4行打印

sed -n '2p;$p' test.txt 2行和最后一行打印

sed -n 'p;n' test.txt	打印奇数行 'n'的作用表示跳过一行打印下一行
sed -e '1 d;n;d' testone	删除奇数行,跳过下一行,删除下下行
sed -n 'n;p' test.txt	打印偶数行
sed -e '2 d;n;d' testone	删除偶数行		

对文本的内容进行过滤 p

sed -n '/o/p' test.txt	过滤并打印包含o的行

sed -n '/th/p' test.txt
sed -ne '/one/,/three/p'过滤包含one到three

使用基础正则表达式对文本内容进行过滤
sed -ne '/^root/p' /etc/passwd
sed -ne '/root$/p' /etc/passwd

需求,从指定行行开始,打印到第1个以bash为结尾的行
sed -ne '3,/bash$/p' /etc/passwd

使用扩展正则对文本内容进行过滤
sed -rne '/(99:){2,}/p' /etc/passwd

要么以root为开头,要么以bash为结尾的行
sed -rne '/^root|bash$/p' /etc/passwd

sed进阶功能

使用sed命令对字符串和字符的位置进行互换.

echo dnzuishuai | sed -r 's/(d)(n)(zuishuai)/\3\1\2/' 
给字符串分组,d是1,n是2,zuishuai是3,将3改为第一个实现字符串位置互换

echo 丁宁真的帅 | sed -r 's/(.)(.)(.)(.)(.)/\5\4\3\2\1/'
.代表单个字符,5个点泛指了5个字符,然后排序
面试题
要求输出版本号
vim test1.txt
ant-1.9.7.jar
ant-launcher-1.9.7.jar
antlr-2.7.7.jar
antlr-runtime-3.4.jar
aopalliance-1.0.jar
archaius-core-0.7.6.jar
asm-5.0.4.jar
aspectjweaver-1.9.5.jar
bcpkix-jdk15on-1.64.jar
bcprov-jdk15-1.46.jar
bcprov-jdk15on-1.64.jar
checker-compat-qual-2.5.5.jar
两种答法
cat test1.txt | grep -E '[0-9]+\.'
cat test1.txt | sed -r 's/(.*)-(.*)(\.jar)/\2/'

打印指定时间内的日志
11.04分到13.01分的日志
cat /var/log/messages|sed -ne '/11:01/,/13:01/p'
面试题
sed '/IPADDR=192.168.118.10/c IPADDR=192.168.118.11' test.txt

vim 123.txt
/IPADDR=192.168.118.10/c
vim 456.txt
IPADDR=192.168.118.11' test.txt

sed -i -f 123.txt 456.txt
cat 456.txt
面试题

如何免交(不进入文件)互删除文本内容,但是不删除文件

sed 'd' test1.txt
sed -i 'd' test1.txt 真删
cat /dev/null > test1.txt
echo " " > test1.txt	假清空,因为留了空格

sed的作用就是对文本的内容进行增删改查,其中最好用的就是改和增

awk

awk的主要作用就是按行取列

awk的默认分隔符:空格,table键,多个空格会自动压缩成一个

工作原理:根据指令信息,逐行的读取文本内容,然后按照条件进行格式化输出.

awk的选项

-F 指定分隔符,默认就是空格

-v 变量赋值

内置变量:

&# 按行处理的第几个字段(按行需要取出的第几个字段)

NR 需要处理的行号

NF 需要处理行字段个数

了解即可

​ $0 打印所有,展示所有的文本内容(默认的)

​ $NF 当前行的最后一个字段

​ FS 和大F一样,指定分隔符,区别就是-F后面直接跟,FS要=“:”

​ OFS 指定输出内容的分隔符

​ RS 行分隔符,可以根据RS的设置把文件内容切割成多个记录,也可以改变行的分隔符,默认是\n,回车,换行

命令格式

按行取列,精确删选,awk必会

awk -F ‘操作符 {动作}’ 处理对象

-F 指定分隔符,如果是空格可以不加

动作 默认就是打印,可以有多个

示例

vim awk.txt
 one two  three
 four five  six
 seven eight nine
awk '{print}' awk.txt

awk打印行号

awk '{print NR}' wak.txt

又打印行号,又打印内容

awk '{print NR,$0}'

打印指定行

awk 'NR==3{print}' awk.txt

范围打印

awk 'NR==1,NR==3{print}' awk.txt

指定行和指定行打印

awk 'NR==1;NR==3{print}' awk.txt

打印奇偶行

awk 'NR%2==1{print}' awk.txt	奇数行
awk 'NR%2==0{print}' awk.txt	偶数行

打印最后一行

awk 'END{print $0}' awk.txt 

指定分隔符打印

cat /etc/passwd

awk -F: '{print $3}' /etc/passwd

打印passwd,1到3行的第三列

awk -F: 'NR==1,NR==3{print $3}' /etc/passwd

打印passwd,1行和3行的第三列

awk -F: 'NR==1{print $3};NR==3{print $3}' /etc/passwd

打印passwd,1到3行的第一二三列

awk -F: 'NR==1,NR==3{print $1,$2,$3}' /etc/passwd

awk怎么使用文本过滤

awk '/root/{print}' /etc/passwd

awk使用正则表达式

awk '/^root/{print}' /etc/passwd
awk '/bash$/{print}' /etc/passwd

BEGIN模式打印

awk 'BEGIN{...};{...};END{....}' 文件
	begin{...}表示预先的条件,执行awk命令前,初始化操作
	{...}第二个大括号是处理条件,怎么对初始值操作
	END{...}结束条件,处理完之后操作,一般都是打印
BEGIN和END一起的情况
awk 'BEGIN{x=0};{x++};END{print x}' awk.txt

后面的两个条件是充分但不必要条件

BEGIN单独用
awk 'BEGIN{print 10*2}'

取幂运算
awk 'BEGIN{print 10**2}'
awk 'BEGIN{print 10^2}'
自定义幂运算

往awk里面传参

a=3

b=4

num=$(awk -v a="$a" -v b="$b" 'BEGIN{print a+b}')

echo $num

-v赋值

awk -v FS=":" -v 0FS="==" '{print $1,$3}' /etc/passwd
echo $PATH|awk = -v RS=":" '{print $1}'

使用awk来进行条件判断打印

awk -F: '$3>900{print $0}' /etc/passwd
awk -F: '!($3>900){print $0}' /etc/passwd
/etc/passwd	第三列等于1000的,打印出来所有
awk -F: '$3==1000{print $0}' /etc/passwd

awk的精确筛查

$n(> < ==)	用于比较数值
$n~"字符串"  该字段包含某个字符串
$n!~"字符串" 该字段不包含某个字符串
$n=="字符串" 该字段等于这个字符串
$n!="字符串" 该字段不等于这个字符串
$NF"字符串" 最后一列
awk -F: '$7~"bash"{print $1,$NF}' /etc/passwd
打印第七列包含bash这个字段的行,取的是bash行的第一列和最后一列,以:为分隔符
awk -F: '$7~"bash"{print $1,$2,$2}' /etc/passwd
取列的是时候没有范围取的

逻辑关系

且 两边的条件都满足

awk -F: '($1=="root")&&($NF=="/bin/bash"){print $1,$NF}' /etc/passwd

或 两边的条件只需满足一个

awk -F: '($1=="root")||($NF=="/bin/bash"){print $1,$NF}' /etc/passwd
面试题

awk的三元表达式

是一个ifelse语句

awk -F: 'num=($3>$4?$3:$4;{print num,$0})' /etc/passwd
?是if
:是esle
;是fi

练习

cat access.log

取出时间和状态码

cat access.log|awk '{print $1,$9,$10}'

对运算进行操作,取小数点几位以及怎么取整数

正常运算
num=$(awk 'BEGIN{print 1.222+2.222}')
echo $num
只取整数
num=$(awk 'BEGIN{printf "%.F",1.222+2.222}')
echo $num
取两位小数
num=$(awk 'BEGIN{printf "%.2f",1.222+2.222}')
echo $num
vim wangzhi.sh
1 www.kgc.com
2 mail.kgc.com
3 ftp.kgc.com
4 linux.kgc.com
5 blog.kgc.com
:wq

awk '{print $2}' wangzhi.txt | awk -F. '{print $1}'
awk -F '[ .]+' '{print $2}' wangzhi.txt

统计/etc/下文件的总大小?awk实现

 ll /etc/|awk '/^-/{print sum+=$5} END{print "文件的总大小是" sum/1024 "M"}'

算 dh -h 里 已用

grep -v "tmpfs" | grep -v "dev/sr0" | awk 'NR>1{sum+=$3} END{print "磁盘的容量是" sum/1024 "G"}'

监控内存,cpu,和硬盘的根目录,要求超过80%提示用户,写成函数库的形式,每天早上的八点五十分,执行一次脚本

cpuzhanyongbi(){
cpu=$(top -b -n 1|awk 'NR==3{sum=$2+$4;printf "%.F",sum}')
echo "cpu占用率:" $cpu "%"
if [[ $cpu > 80 ]]
then
 echo "cpu占用率已超标"
else
 echo "cpu占用率属于正常占用"
fi
}
neicunzhanyongbi(){
memory=$(free -m|awk 'NR==2{quotient=$3/$2;printf "%.2f",quotient*100}')
echo "内存占用率:" $memory "%"
if [[ $memory > 80 ]]
then
 echo "内存占用率已超标"
else
 echo "内存占用率属于正常占用"
fi
}
yingpanzhanyongbi(){
disk=$( df|awk 'NR==2{print $5}'|tr -d '%')
echo "根目录占用率:" $disk "%"
if [[ $disk > 80 ]]
then
 echo "根目录占率用已超标"
else
 echo "根目录用率属于正常占用"
fi
}

vim zuoye1.sh
. /root/zuoye1hanshuku.sh
cpuzhanyongbi
neicunzhanyongbi
yingpanzhanyongbi
:wq

crontab -e
50 8 * * * /root/zuoye1.sh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值