20200604sed awk

写在前面:

又是linux复习

感觉对未来的规划更加清楚了,知道了自己想要什么,最近还是比较开心啊,但是学习的进度真是有些慢了。想用自己的第一个月的薪水买mac book pro,哈哈。但是听说公司普遍降薪了。现在就想着三年后,合同到期,自己就要跳槽的事情。

[:alnum:]数字英文字母 0~9 A~Z a~z
[:alpha:]英文字母A~Z a~z
[:blank:]代表空格键与Tab键
[:digit:]代表数字
[:lower:]a~z
[:upper:]A~Z

grep

-c         计算找到字符的次数

-i          忽略大小写的不同

-n         输出行号

-v          反向选择

-A         后面可加数字,为after,将除了改行,后续n行也输出

-B         后面加数字,为before, 除了列出改行外,前面的n行也列出来

# 关键字所在行的前两行和后三行都列出来
demsg | grep -n A3 -B2 'xx'

带正则的gerp

grep -n 't[ae]st' xx
grep -n '[^g]oo' xx
grep -n '[0-9]' xx
gerp -n '[^[:lower:]]oo' xx
grep -n '[[:digit:]]' xx
grep -n '^the' xx
gerp -n '^[^a-zA-Z]' xx  # 第一个^是以开头的意思,第二个是非的意思
grep -n '\.$'  xx
gerp -n '^$' xx 选择空白
grep -n 'go\{2,5\}'  xx # 注意要转义

sed

-n 使用安静模式,在一般的sed的使用法中,所有来自stdin的数据一般都会被列出到屏幕上,但是如果加上了-n参数后,则只有经过sed特殊处理的那一行才会被列出来。

-e 直接在命令模式上进行sed操作编辑。

-f 直接将sed的操作写在一个文件内,-filename 则可以执行filenam内的sed操作。

-r sed的操作使用的是扩展正则表达式的语法。

-i 直接修改读取的文件内容,而不是由屏幕输出。

操作说明: [n1,[n2]] function

n1,n2 位数字,表示数字范围

a      新增,a的后面可以接字符串,这些字符会在新的一行出现,目前的下一行

c      替换,c的后面可以接字符,这些字符可以替换n1,n2之间的行

d      删除,因为删除,所以后面通常不接任何东西

i       插入,i的后面可以接字符,而这些字符会在新的一行出现,目前的上一行

p      打印,亦即某个选择的数据打印出来

s      替换,可以直接进行替换的工作,通常这个 s的操作可以搭配正则表达式,例如,1,20s/old/new/g

 nl /etc/passwd | sed '2,5d'   # nl是添加行号打印,同时将2~5行删除
 nl /etc/passwd | sed '2d'     # 删除第二行
 nl /etc/passwd | sed '3,$d'   # 删除第三行之后,不包括第二行
nl /etc/passwd | sed '2a drink tea'         # 在第二行后添加 
     1	root:x:0:0:root:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
drink tea

nl /etc/passwd | sed '2i drink tea'        # 在第二行后面添加
nl /etc/passwd | sed '2,5c xxxx'  # 二到五行 替换成xx
nl /etc/passwd | sed -n '5,7p'    # 将5到7行打印出来

替换:

sed 's/要被替换的字符/新的字符/g'


vim的替换
n1,n2s/word1/word2/g         

sed直接修改文件内容

sed -i 's/\.$/\!/g' xx   # 直接替换文件内容
sed -i '$a XX' XX        # 在最后一行添加,$最后一行,a是添加



sed -i 's/off/down/g' test 

 

egrap:

就是grep -e  ,就是grep加正则。

grep -v '^$' xx | grep -v '^#'  # 去除空白行和以#开头的行
egrep -v '^$ | ^#' xx           # 等价于下边

 

printf:

\a    警告声音输出

\n    输出新的一行

\b    退格键

\f     清除屏幕

\v    垂直tab按键

\r    回车按键

\t    水平的tab键   

printf '%10s\t %s\t %s\t %s\t %s\t \n' $(cat test)

 

awk

awk主要是处理每一行的字段内的数据,而默认的字段的分隔符为"空格键"和tab键。

$0 代表一整行数据

[root@iz2zeczv3xrnm2jx6aayhxz ~]# last -n 5
root     pts/0        36.49.165.15     Fri Jun  5 12:53   still logged in   
root     pts/0        36.49.165.15     Thu Jun  4 22:46 - 22:59  (00:13)    
root     pts/0        36.49.165.15     Thu Jun  4 20:38 - 22:12  (01:33)    
root     pts/2        172.24.20.165    Wed Jun  3 14:25 - 14:25  (00:00)    
root     pts/2        172.24.20.165    Wed Jun  3 14:24 - 14:24  (00:00)    
last -n 5 | awk '{print $1 "\t" $3}'    # $1是第一个变量的意思,$3是第二个变量的意思
root	36.49.165.15
root	36.49.165.15
root	36.49.165.15
root	172.24.20.165
root	172.24.20.165

awk的几个变量

NF    每一行拥有字段总数

NR    目前awk所处理的是第几行数据

FS     目前的分割符号,默认是空格键

逻辑运算符:

<, >, >=, <=, ==, !=

last -n 5 | awk '{print $1 "\t" NR "\t col" NR}'

 下面的逻辑是看行数,如果行数大于3,就换分隔符,但是有个问题,就是第一行没生效,这是因为第一行,那些变量默认时还是以空格分割的。

cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3}'
root:x:0:0:root:/root:/bin/bash	
bin	1
daemon	2
adm	3
lp	4
sync	5
shutdown	6
halt	7
mail	8
cat /etc/passwd | awk 'BEGIN {FS=":"} $3 <10 {print $1 "\t" $3}'
root	0
bin	1
daemon	2
adm	3
lp	4
sync	5
shutdown	6
halt	7
mail	8

稍微复杂的命令,就是加了一个total 字段,并且计算和

注意换行 是  末尾 \ 加回车

cat test | awk 'NR==1 {printf "%10s %10s %10s %10s %10s\n", $1, $2, $3, $4, "total"}
NR>=2{total = $2 + $3 + $4
printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'
      Name        Chi        Eng        mat      total
    dotsai         80         60         92     232.00
        VB         75         55         80     210.00

加上if判断:

 cat test | awk '{if(NR==1) printf "%10s %10s %10s %10s %10s\n", $1,$2,$3,$4,"Total"}
NR>=2{total = $2+$3+$4
printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4, total}'

 

文件对比 diff

比对两个文件的差异,以行为单位对比。

cat /etc/passwd | sed -e '4d' -e '3,6c six six' > passwd.new   # 删除第四行 替换第三到六行
diff /etc/passwd passwd.new 
3,6c3
< daemon:x:2:2:daemon:/sbin:/sbin/nologin
< adm:x:3:4:adm:/var/adm:/sbin/nologin
< lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
< sync:x:5:0:sync:/sbin:/bin/sync
---
> six six

diff [-bBi] from-file to-file

from-file: 一个文件名,作为原始对比文件

to-file: 文件名,作为目标对比文件

-b:   忽略一行当中,仅有多个空的差异,about me 和 about   me 的区别

-B:   忽略空白行的差异

-i:     忽略大小的不同

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值