第二十九节、awk命令列切割/sed内容替换/find查找

一、行文本处理awk命令

原理:逐行处理文本中的数据
格式:awk -F “自定义分割符号” '{print $Nu}'
语法:awk 'pattern + {action}'

  1. 单引号''是为了和shell命令区分开
  2. 大括号{}表示一个命令分组
  3. pattern是一个过滤器,表示符合pattern条件的行才进行action处理
  4. action是处理动作
  5. 使用#作为注释
  6. pattern和action可以只有其一,但不能两者都没有
  7. 默认的action是print
  • 默认是以空白为分割符号,空格之间内容算一列
  • F参数可以指定分割符
  • print参数后面可以用双引号""添加多种需要打印的内容,而且可以同时打印多列参数
awk内置变量

FS 分隔符,默认是空格
NR 当前行数,从1开始
NF 当前记录字段个数
0 当前记录1~$n 当前记录第n个字段

内置函数

gsub(r,s):在$0中用s代替r
index(s,t):返回s中t的第一个位置
length(s):s的长度
match(s,r):s是否匹配r
split(s,a,fs):在fs上将s分成序列a
substr(s,p):返回s从p开始的子串
下面以/etc/passwd文件为例进行一些操作尝试

#默认以空格分割,那整个文件就只有一列,打印最后一列结果如下
[root@localhost ~]# cat /etc/passwd|awk '{print $1}'|tail -1
tcpdump:x:72:72::/:/sbin/nologin
#用冒号分割打印第一列用户名
[root@localhost ~]# cat /etc/passwd|awk -F: '{print $1}'|tail -1
tcpdump
#从ifconfig结果中匹配出Ip地址,思路:先grep匹配所在行,再用awk列切割
#匹配行
[root@localhost ~]# ifconfig|grep "Bcast"
          inet addr:192.168.15.172  Bcast:192.168.15.255  Mask:255.255.255.0
#切割列同时将多余字符替换为空
[root@localhost ~]# ifconfig|grep "Bcast"|awk '{print $2}'|sed 's/addr://g'
192.168.15.172
#也可以进行2次awk切割
[root@localhost ~]# ifconfig|grep "Bcast"|awk '{print $2}'|awk -F: '{print $2}'
192.168.15.172
[root@localhost ~]# ifconfig|grep "Bcast"|awk '{print $2}'|awk -F: '{print "ip:"$2"-"$1}'  
ip:192.168.15.172-addr
#打印文件的第1,3行用分号间隔条件
[root@localhost sh]# cat test.txt|awk 'NR==1;NR==3 {print $0}' 
www.jf.com aaa
www.jf.com ccc
#打印第3行以后内容
[root@localhost sh]# cat test.txt|awk 'NR>=3 {print $0}'       
www.jf.com ccc
www.jf.com ddd
www.jf.com eee
#打印符号条件最后一个域(默认空格分割的最后一列)
[root@localhost sh]# cat test.txt|awk '{print $NF}' 
aaa
bbb
ccc
#打印倒数第2个域
[root@localhost sh]# cat test.txt|awk '{print $(NF-1)}'
www.jf.com
www.jf.com
#查看tcp监听端口的状态
[root@localhost sh]# netstat -an|awk '/^tcp/ {print $NF}'
LISTEN
LISTEN             #监听
ESTABLISHED #转发
#扫描文件打印所有字符长度大于80的行的行号NR
[root@localhost sh]# cat test.txt|awk 'length($0)>80 {print NR}'
二、对象查找命令find

格式: find 查找范围(某个目录) -name "file_name"
如果用/根目录就是全盘扫描,比较慢

  • name 参数指定文件名可以搭配通配符,! -name "filename"表示不包含某个文件
  • type 参数可以限定查找对象范围,如-type f就是查找文件,d就是查找目录
  • exec 是扩展参数和其他命令搭配使用
  • size 参数指定对象大小如+1M,表示大于1M
  • mtime 参数表示修改时间,默认单位天- mtime +30表示30天前,- mtime -30表示30天内
  • perm 参数表示查找权限如-perm 644
  • maxdepth 参数决定查找目录的深度-maxdepth 1表示只找目标的下一级目录
#在/data目录下查找所有以.sh结尾的文件
[root@localhost ~]# find /data/ -name  "*.sh"
/data/sh/ssh_ip.sh
/data/sh/while_scp_dir

利用for循环拷贝查找对象到指定目录

[root@localhost ~]# for i in `find /data/ -name  "*.sh"`;do  cp $i /root/ ;done
#删除查找对象,{}表示前面超找对象   \;是find命令固定用法表示结束无其他意义
[root@localhost ~]# find /data/ -name  "*.sh"|xargs rm -rf {} \;
#拷贝对象
[root@localhost ~]# find /data/ -name  "*.sh" -exec cp {}  /tmp/ \;
#移走对象
[root@localhost ~]# find /data/ -name  "*.sh" -exec mv  {}  /tmp/ \;
三、文本编辑处理替换命令sed

格式:sed -i '1,3s/old/new/g' filename
替换部分的字段必须加单引号'',单引号内第一个参数s表示替换,不加参数留空表示查找,末尾参数g表示全局扫描,不带g参数只会替换找到的第一个对象,1,3表示针对具体行

  • i参数表示修改,不加i参数只能在屏幕上输出预览修改都的效果并不会修改源文件,加i参数就没有输出直接改源文件
  • a参数表示在查找对象下一行添加内容,不带空格a后面直接跟添加内容
  • i 单引号内i参数表示在上一行插入
#n/p参数搭配使用查找特定对象
[root@localhost ~]# df -h|sed -n '/sda1/p'
/dev/sda1       194M   30M  155M  17% /boot
#预览添加内容如给脚本加个注释语句,注意a后面直接跟内容
[root@localhost sh]# sed '/192.168.15.2/a#this is test' ip_list
192.168.15.1 /var/www/html1 /data/www/html1
192.168.15.2 /var/www/html2 /data/www/html2
#this is test
#上一行插入
[root@localhost sh]# sed '/192.168.15.2/i#this is test2' ip_list   
192.168.15.1 /var/www/html1 /data/www/html1
#this is test2
192.168.15.2 /var/www/html2 /data/www/html2
#结合命令打印1到3行,用逗号间隔
[root@localhost ~]# df -h|sed -n '1,3p'
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        77G  3.5G   70G   5% /
tmpfs           491M     0  491M   0% /dev/shm
#结合命令打印1和3行,用分号间隔
[root@localhost ~]# df -h|sed -n '1p;3p'
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           491M     0  491M   0% /dev/shm
#查找以/结尾的行打印出来
[root@localhost ~]# df -h|sed -n '/\/$/p'
/dev/sda2        77G  3.5G   70G   5% /
#多个替换可以一起书写如将%及G替换为空,替换字段用分号间隔
[root@localhost ~]# df -h|sed -n '/\/$/p'|sed 's/G//g;s/%//g'
/dev/sda2        77  3.5   70   5 /
[root@localhost ~]# df -h|sed -n '/\/$/p'|sed -e 's/G//g' -e's/%//g'
/dev/sda2        77  3.5   70   5 /
#在每行的末尾或者开头追加字段,&表示追加,注意追加字段的空格处理
[root@localhost sh]# sed 's/^/&www.jf.com /g' test.txt 
www.jf.com aaa
www.jf.com bbb
www.jf.com ccc
[root@localhost sh]# sed 's/$/& www.jf.com/g' test.txt   
aaa www.jf.com
bbb www.jf.com
ccc www.jf.com

示例

#预览替换后全部文件
sed 's/This/aaa/' test.txt
#-n选项和p命令一起使用表示只打印那些发生替换的行
sed  -n 's/This/aaa/p' test.txt
#直接编辑文件选项-i,会匹配test.txt文件中每一行的第一个This替换为this
 sed -i 's/This/this/' test.txt
#全面替换标记g,使用后缀/g标记会替换每一行中的所有匹配
sed 's/this/This/g' test.txt
#当需要从第N处匹配开始替换时,可以使用/Ng
echo sksksksksksk | sed 's/sk/SK/2g'
skSKSKSKSKSK
echo sksksksksksk | sed 's/sk/SK/4g'
skskskSKSKSK
#以上命令中字符 / 在sed中作为定界符使用,也可以使用任意的定界符
echo sksksksksksk | sed 's:sk:SK:4g'
echo sksksksksksk | sed 's|sk|SK|4g'
#定界符出现在样式内部时,需要进行转义
 echo '/usr/local/bin' | sed 's/\/usr\/local\/bin/\/USR\/LOCAL\/BIN/g'
/USR/LOCAL/BIN
#删除空白行d
 sed '/^$/d' test.txt
#删除文件指定第2行(编辑文件需要和参数i配合使用)
sed '2d' test.txt
#删除文件的第2行到末尾所有行
sed '2,$d' test.txt
#删除文件最后一行
sed '$d' test.txt
#删除文件中所有以my开头的行
sed '/^my/'d test.txt
#打印从第5行开始到第一个包含以this开始的行之间的所有行
 sed -n '5,/^this/p' test.txt
#-e选项允许在同一行里执行多条命令,第一条命令删除1至5行,第二条命令用MY替换my。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个命令将影响第二个命令的结果
sed -e '1,5d' -e 's/my/MY/' test.txt
#写入命令w,在test.txt中所有包含my的行都被写入test2.txt里
sed -n '/my/w test2.txt' test.txt

参考文章
https://www.cnblogs.com/maxincai/p/5146338.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容