写在前面:
又是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行也列出来
1
2# 关键字所在行的前两行和后三行都列出来 demsg | grep -n A3 -B2 'xx'
带正则的gerp
1
2
3
4
5
6
7
8
9
10
11
12
13
14grep -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
1
2
3
4
5
6nl /etc/passwd | sed '2,5d' # nl是添加行号打印,同时将2~5行删除 nl /etc/passwd | sed '2d' # 删除第二行 nl /etc/passwd | sed '3,$d' # 删除第三行之后,不包括第二行
1
2
3
4
5
6
7nl /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' # 在第二行后面添加
1
2
3
4nl /etc/passwd | sed '2,5c xxxx' # 二到五行 替换成xx nl /etc/passwd | sed -n '5,7p' # 将5到7行打印出来
替换:
1
2
3
4sed 's/要被替换的字符/新的字符/g' vim的替换 n1,n2s/word1/word2/g
sed直接修改文件内容
1
2
3
4
5
6sed -i 's/.$/!/g' xx # 直接替换文件内容 sed -i '$a XX' XX # 在最后一行添加,$最后一行,a是添加 sed -i 's/off/down/g' test
egrap:
就是grep -e ,就是grep加正则。
1
2
3
4grep -v '^$' xx | grep -v '^#' # 去除空白行和以#开头的行 egrep -v '^$ | ^#' xx # 等价于下边
printf:
a 警告声音输出
n 输出新的一行
b 退格键
f 清除屏幕
v 垂直tab按键
r 回车按键
t 水平的tab键
1
2printf '%10st %st %st %st %st n' $(cat test)
awk
awk主要是处理每一行的字段内的数据,而默认的字段的分隔符为"空格键"和tab键。
$0 代表一整行数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32[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)
1
2
3
4
5
6
7last -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 目前的分割符号,默认是空格键
逻辑运算符:
<, >, >=, <=, ==, !=
1last -n 5 | awk '{print $1 "t" NR "t col" NR}'
下面的逻辑是看行数,如果行数大于3,就换分隔符,但是有个问题,就是第一行没生效,这是因为第一行,那些变量默认时还是以空格分割的。
1
2
3
4
5
6
7
8
9
10
11cat /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
1
2
3
4
5
6
7
8
9
10
11cat /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 字段,并且计算和
注意换行 是 末尾 加回车
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19cat 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判断:
1
2
3cat 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
比对两个文件的差异,以行为单位对比。
1
2
3
4
5
6
7
8
9
10
11cat /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内容请搜索靠谱客的其他文章。
发表评论 取消回复