概述
写在前面:
又是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 '%10st %st %st %st %st 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 %10sn", $1, $2, $3, $4, "total"}
NR>=2{total = $2 + $3 + $4
printf "%10s %10d %10d %10d %10.2fn", $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 %10sn", $1,$2,$3,$4,"Total"}
NR>=2{total = $2+$3+$4
printf "%10s %10d %10d %10d %10.2fn",$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: 忽略大小的不同
最后
以上就是现实人生为你收集整理的20200604sed awk的全部内容,希望文章能够帮你解决20200604sed awk所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复