awk
awk ‘条件1{动作1} 条件2{动作2}’ 文件名
[admin@host ~]$ cat student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
输出第2列和第6列
[admin@host ~]$ awk '{printf $2 "\t" $6 "\n"}' student.txt
Name Average
Liming 87.66
Sc 85.66
Gao 91.66
BEGIN
[admin@host ~]$ awk 'BEGIN{printf "This is a transcript \n" }
> {printf $2 "\t" $6 "\n"}' student.txt
This is a transcript
Name Average
Liming 87.66
Sc 85.66
Gao 91.66
END
[admin@host ~]$ awk 'END{printf "The End \n" }
> {printf $2 "\t" $6 "\n"}' student.txt
Name Average
Liming 87.66
Sc 85.66
Gao 91.66
The End
FS(Field Separator):列分割符。决定了怎么将一行划分为几段。预设值是空白符(空白和Tab)。
[admin@host ~]$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
…
rec:x:1002:1002::/home/rec:/bin/bash
[admin@host ~]$ cat /etc/passwd | grep "/bin/bash" | \
> awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\n"}'
root 0
admin 1000
crassus 1001
rec 1002
关系运算符
[admin@host ~]$ cat student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
[admin@host ~]$ cat student.txt | grep -v Name | awk '$6 >= 87 {printf $2 "\n" }'
Liming
Gao
sed
sed 是一种几乎包括在所有 UNIX 平台(包括 Linux)的轻量级流编辑器。 sed主要是用来将数据进行选取、替换、删除、新增的命令。
[root@localhost ~]# sed [选项] ‘[动作]’ 文件名
符号 | 含义 |
---|---|
-n | 一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。 |
-e | 允许对输入数据应用多条sed命令编辑。 |
-i | 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出。 |
a \ | 追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用"\" 代表数据未完结。 |
c \ | 行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用"\" 代表数据未完结。 |
i \ | 插入,在当期行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用"\" 代表数据未完结。 |
d | 删除,删除指定的行。 |
p | 打印,输出指定的行。 |
s | 字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)。 |
文本内容
[admin@host ~]$ cat student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
打印第2行
[admin@host ~]$ cat student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
[admin@host ~]$ sed '2p' student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
[admin@host ~]$ sed -n '2p' student.txt
1 Liming 82 95 86 87.66
删除第2行到第4行
[admin@host ~]$ cat student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
[admin@host ~]$ sed '2,4d' student.txt
ID Name PHP Linux MySQL Average
在第2行后追加hello
[admin@host ~]$ sed '2a hello' student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
hello
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
在第2行前添加hello world
[admin@host ~]$ sed '2i hello world' student.txt
ID Name PHP Linux MySQL Average
hello world
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
把第2行替换
[admin@host ~]$ sed '2c No such person' student.txt
ID Name PHP Linux MySQL Average
No such person
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
字符串替换
[admin@host ~]$ sed '3s\74\99\g' student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 99 96 87 85.66
3 Gao 99 83 93 91.66
直接写入文件
[admin@host ~]$ sed -i '3s\74\99\g' student.txt
[admin@host ~]$ cat student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 99 96 87 85.66
3 Gao 99 83 93 91.66
同时把Liming和Gao替换为空
[admin@host ~]$ sed -e 's/Liming//g ; s/Gao//g' student.txt
ID Name PHP Linux MySQL Average
1 82 95 86 87.66
2 Sc 99 96 87 85.66
3 99 83 93 91.66
sort
[root@localhost ~]# sort [选项] 文件名
符号 | 含义 |
---|---|
-f | 忽略大小写 |
-n | 以数值型进行排序,默认使用字符串型排序 |
-r | 反向排序 |
-t | 指定分隔符,默认是分隔符是制表符 |
-k [n,m] | 按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾) |
以:为分隔符,按第3个字段排序
[admin@host ~]$ sort -t ":" -k 3,3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
admin:x:1000:1000::/home/admin:/bin/bash
sort完全去重
$ sort -u testfile
1
2
3
4
5
6
wc
[root@localhost ~]# wc [选项] 文件名
符号 | 含义 |
---|---|
-l | 只统计行数 |
-w | 只统计单词数 |
-m | 只统计字符数 |