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