三剑客
功能
grep过滤
sed过滤,修改(增删改查)取行
awk过滤 取列 统计计算
grep 过滤
-n 显示行号
-i 不区分大小写
-w 以完整单词显示内容
-v 取反
-o 显示过滤过程
-E 可过滤扩展正则egrep
-c统计包含引号内容的一共有几行
-l (grep过滤时只显示文件名不显示内容)
-R递归进行过滤(在最后查找可以接目录)
-A显示grep查找出的内容的行及接下来的行(行数为参数后面所接数字)
-B显示grep查找出的内容的行及之前的行 (行数为参数后面所接数字)
-C显示grep查找出的内容的行及前后的行 (行数为参数后面所接数字)
sed stream editor流编辑器
过滤,修改(增删改查),取行
(格式:sed参数 ‘条件命令’ 所查找文件)
参数
-n取消默认输出(sed会默认将文件内容全部显示)
-i修改文件内容
-i.bak 先备份文件为带后缀.bak带新文件,再修改原文件内容
-r支持扩展正则
-e 可时进行两次操作
(!不)
查 p显示 !p 不显示
sed -n '3p' /oldboy/lidao.txt
显示第三行的内容
sed -n '$p' /oldboy/lidao.txt
显示最后一行的内容
sed -n '1,3p' /oldboy/lidao.txt
显示一到三行的内容
sed -n '/oldboy/p' /oldboy/lidao.txt
显示包含oldboy的行(//内可使用正则过滤)
sed -n '/oldboy/,/lidao/p' /oldboy/lidao.txt
显示从第一个包含/oldboy/的行到第一个/lidao/的行(循环查找)
增加 c a i
sed '1,3a162,habijisd.CDF' lidao.txt
a 在下一行追加 (真实文件内容未被修改)
i 在这一行插入 (真实文件内容未被修改)
c 先清空,再写入 (真实文件内容未被修改)
删除
sed '3d' lidao.txt删除第三行
sed '/yy/d' lidao.txt删除有yy的行
d删除
替换 s sub替换
sed 's#oldboy#alex#g ' oldboy.txt
将oldboy替换为alex
sed默认替换每一行匹配到的第一个内容
g代表全局替换
后向引用
[root@lc-59 /tmp]# echo 123456 |sed -r 's#(.*)#<\1>#g'
<123456>
\1数字1代表前面两个#之间的第一个()及里面的内容
I d不区分大小写
awk 删除取列取行统计计算
awk '条件{命令}' 文件
print显示
内置变量(类似Linux下的环境变量)
NR 行数
NF 最后一列
$数字 某一列 $3第3列
$0 一整行的内容
FS -F修改的内容(修改的就是FS)(Field Separator)分隔符
OFS 指awk在显示每一列的时候 每一列之间通过什么分割,OFS的内容是{print $1,$3}的,的内容(Output Field Separator) 输出分割符
参数
-F 指定分隔符
awk -F"," '条件{命令}' 文件
指定以,为分隔符
awk -F"[ /]" '条件{命令}' 文件
指定以/或空格为分隔符
awk -F"[ /]+" '条件{命令}' 文件
指定以/或空格或连续出现的空格与/为一个分隔符
-v 修改awk的内置变量
-vFS==-F
-vOFS修改输出分隔符(设置显示的分隔符)
-vOFS=”显示的内容”
取行 record记录
awk 'NR==3' lidao.txt
取出第三行
awk '/oldboy/' lidao.txt
取出包含oldboy的行
取列field字段
awk '{print $1}' oldboy.txt
取出第一列
awk '{print $1,$5}' oldboy.txt
取出第一列和第五列
[root@lc-59 /tmp]# awk '{print $1"%%"$2"%%"$3}' oldboy.txt
am%%oldboy%%teacher!
取出第一列第二列第三列中间用%%隔开
awk '{print $NF}' oldboy.txt
取最后一列
过滤awk中什么可以当作条件
将第一列和最后一列交换位置
(假定一个空位置tmp,tmp变1,1变NF,NF变tmp)
awk ‘{tmp=$1;$1=$NF;$NF=tmp;print $0}’ /oldboy
比较
[root@lc-59 ~]# awk -F":" '$3>999' /etc/passwd
oldboy:x:1000:1000::/home/oldboy:/bin/bash
找出第三列中大于999的行
[root@lc-59 ~]# awk -F":" '$3<999 && $3>500' /etc/passwd
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
找出第三列中小于999并且大于500的行
(>)(<)(>=)(<=)(==)(!=)
[root@lc-59 ~]# df -h |awk '$5+0>5'
/dev/sda3 19G 1.8G 18G 10% /
/dev/sda1 197M 105M 93M 54% /boot
[root@lc-59 ~]# df -h |awk '$5>5'
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 197M 105M 93M 54% /boot
当出现特殊符号时+0使其转换为数字
正则
awk '/oldboy/' /lidao.txt
取出以oldboy开头的行
awk '$3~/oldboy/' /lidao.txt
取出第三列中以oldboy开头的行
awk '$3~/oldboy/{print $(NF-1)}' /lidao.txt
取出第三列中以oldboy开头的行,显示倒数第二列
awk中的替换 gsub
gsub(/需替换的内容/,”被替换的内容”)
awk ’{gsub(/:/,”$”);print $0}’ /oldboy/reg.txt
将:替换成$(将文件所有内容替换)
print $0显示这一行的所有内容
awk ’{gsub(/:/,”$”,$NF);print $0}’ /oldboy/reg.txt
替换最后一列的内容
范围
sed -n ‘1,5p’ oldboy.txt
== awk ‘NR==1,NR==5’ oldboy.txt
显示从第一行到第五行
sed -n ‘/11:10/,/12:10/p’ access.log
==awk ‘/11:10/,/12:10/’ access.log
awk ‘$4~/11:10/,$4~/12:10/’access.log指定列数
特殊
BEGIN{}
花括号里的内容会在awk读取文件之前运行
进行测试
END{} 显示最后一个结果
显示计算的最后结果
awk ‘/^$/{i=i+1}END{print i}’ /oldboy.txt
计算
i=i+1或i++ 进行计数
统计一共出现多少次
awk ‘/^$/{i=i+1;print i}’ /oldboy.txt
I=i+$0统计总数 求和
seq 100|awk ‘{i=i+$1}END{print i}’求1-100的总和
获取字符长度
[oldchang@oldboy-node101 ~]$ oldchang="www.oldboyedu.com"
[oldchang@oldboy-node101 ~]$ echo ${oldchang} | awk '{print length}'
17
老男孩教育-sed命令执行过程
https://www.processon.com/view/link/5bea32c5e4b0ad314e894f53
老男孩教育-awk命令执行过程-完整
https://www.processon.com/view/link/5becee35e4b0d74dc540e690
wc -l 查看空行数
cp -t 将需复制的文件与被复制到的目录交换位置
cp /oldboy.txt /tmp/ ==== cp -t /tmp/ /oldboy.txt
把根下odboy.txt文件复制到/tmp目录下
xargs -i {}xargs -i是让xargs后面可以使用花括号,表示管道前面find找到的文件
ip a s eth0
Ip address show eth0显示ip地址的eth0的网卡信息
stat显示文件信息