1.cut命令
1.1命令格式
1.2命令样例
2.awk命令
2.1printf格式化输出
2.2演示数据
2.3awk命令格式
2.4awk
2.5用例
3.sed命令
3.1语法
4.sort命令
4.1命令格式
4.2测试样例
cut 命令的默认分隔符是制表符,也就是“tab”键
cut [选项] 文件名
-f 列号: 提取第几列
-d 分隔符: 按照指定分隔符分割列
-c 字符范围: 不依赖分隔符来区分列,而是通过字符范围(行首为 0)来进行字段 提取。“n-”表示从第 n 个字符到行尾;“n-m”从第 n 个字符到第 m 个字符;“-m”表示从第 1 个字符到第 m 个字符。
数据
vi student.txt
ID Name gender Mark
1 Liming M 86
2 Sc M 90
3 Tg M 83
cut -f 2 student.txt 截取第二列
grep -v 'Name' student.txt|cut -f 2 student.txt 去掉列头展示第二列
cut -f 2,3 student.txt 截取第2,3列
cut -d ':' -f 1,2,3 /etc/passwd 使用:分割/etc/passwd每行,并截取1,2,3列
printf ‘输出类型输出格式’ 输出内容 输出类型:
%ns: 输出字符串。n 是数字指代输出几个字符
%ni: 输出整数。n 是数字指代输出几个数字
%m.nf: 输出浮点数。m 和 n 是数字,指代输出的整数位数和小数位数。如%8.2f
代表共输出 8 位数,其中 2 位是小数,6 位是整数。
输出格式:
\a: 输出警告声音
\b: 输出退格键,也就是 Backspace 键
\f: 清除屏幕
\n: 换行
\r: 回车,也就是 Enter 键
\t: 水平输出退格键,也就是 Tab 键
\v: 垂直输出退格键,也就是 Tab 键
vi student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Tg 99 83 93 91.66
printf '%s' $(cat student.txt) 格式混乱
printf '%s\t %s\t %s\t %s\t %s\t %s\t \n' $(cat student.txt) 按照指定格式输出
printf '%i\t %s\t %i\t %i\t %i\t %8.2f\t \n' \
$(cat student.txt | grep -v Name) 将字段转换为指定类型
awk ‘条件 1{动作 1} 条件 2{动作 2}…’ 文件名
awk '{printf $2 "\t" $6 "\n"}' student.txt 输出第二列和第6列
条件的类型 |
条 件 |
|
说 明 |
awk 保留字 |
BEGIN |
在 awk 程序一开始时,尚未读取任何数据之前执行。BEGIN 后 的动作只在程序开始时执行一次 |
|
|
END |
在 awk 程序处理完所有数据,即将结束时执行。END 后的动作 只在程序结束时执行一次 |
|
|
> < >= |
大于 小于 大于等于 |
|
|
<= |
小于等于 |
|
关系运算符 |
== |
等于。用于判断两个值是否相等,如果是给变量赋值,请使用 “=”号 |
|
|
!= |
不等于 |
|
|
A~B |
判断字符串 A 中是否包含能匹配 B 表达式的子字符串 |
|
|
A!~B |
判断字符串 A 中是否不包含能匹配 B 表达式的子字符串 |
|
正则表达式 |
/正则/ |
如果在“//”中可以写入字符,也可以支持正则表达式 |
awk执行流程
1) 如果有 BEGIN 条件,则先执行 BEGIN 定义的动作
2) 如果没有 BEGIN 条件,则读入第一行,把第一行的数据依次赋予$0、$1、$2 等变量。其中$0
代表此行的整体数据,$1 代表第一字段,$2 代表第二字段。
2) 依据条件类型判断动作是否执行。如果条件符合,则执行动作,否则读入下一行数据。如果 没有条件,则每行都执行动作。
3) 读入下一行数据,重复执行以上步骤。
awk 内置变量
awk 内置变量 |
作 用 |
$0 |
代表目前 awk 所读入的整行数据。我们已知 awk 是一行一行读入数据 的,$0 就代表当前读入行的整行数据。 |
$n |
代表目前读入行的第 n 个字段。 |
NF |
当前行拥有的字段(列)总数。 |
NR |
当前 awk 所处理的行,是总数据的第几行。 |
FS |
用户定义分隔符。awk 的默认分隔符是任何空格,如果想要使用其他 分隔符(如“:”),就需要 FS 变量定义。 |
ARGC |
命令行参数个数。 |
ARGV |
命令行参数数组。 |
FNR |
当前文件中的当前记录数(对输入文件起始为 1)。 |
OFMT |
数值的输出格式(默认为%.6g)。 |
OFS |
输出字段的分隔符(默认为空格)。 |
ORS |
输出记录分隔符(默认为换行符)。 |
RS |
输入记录分隔符(默认为换行符)。 |
cat student.txt | grep -v Name | \
awk '$6 >= 87 {printf $2 "\n" }' #判断第6列的值大于87,如果成立打印第二行
awk '$2 ~ /Sc/ {printf $6 "\n"}' student.txt 获取Sc的成绩
cat /etc/passwd | grep "/bin/bash" | \
awk '{FS=":"} {printf $1 "\t" $3 "\n"}' 查询可以登录用户的 name和UID
sed 主要是用来将数据进行选取、替换、删除、新增的命令
sed [选项] ‘[动作]’ 文件名
选项:
-n: 一般 sed 命令会把所有数据都输出到屏幕,如果加入此选择,则只会 把经过 sed 命令处理的行输出到屏幕。
-e: 允许对输入数据应用多条 sed 命令编辑。
-f 脚本文件名: 从 sed 脚本中读入 sed 操作。和 awk 命令的-f 非常类似。
-r: 在 sed 中支持扩展正则表达式。
-i: 用 sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作:
a \: 追加,在当前行后添加一行或多行。添加多行时,除最后 一行外, 每行末尾需要用“\”代表数据未完结。
c \: 行替换,用 c 后面的字符串替换原数据行,替换多行时,除最后一行 外,每行末尾需用“\”代表数据未完结。
i \: 插入,在当期行前插入一行或多行。插入多行时,除最后 一行外, 每行末尾需要用“\”代表数据未完结。
d: 删除,删除指定的行。
p: 打印,输出指定的行。
s: 字串替换,用一个字符串替换另外一个字符串。格式为“行范围 s/
旧字串/新字串/g”(和 vim 中的替换格式类似)。
3.2练习
sed -n '2p' student.txt 打印第二行
sed '2,4d' student.txt 删除第2-4行 ,并没有修改文件的内容,
sed -i '2,4d' student.txt 删除第2-4行,并修改文件的内容
sed '2a hello' student.txt 在第二行后面追加hello
sed '2i hello \
> world' student.txt 在第二行前插入 两行 \为换行符
cat student.txt | sed '2c No such person' 替换第二行为指定的字符
sed ‘s/旧字串/新字串/g’ 文件名 字符串替换
sed '3s/74/99/g' student.txt 替换第三行中的字符串
sed '4s/^/#/g' student.txt 将第4行注释掉
sed -e 's/Liming//g ; s/Tg//g' student.txt 执行多个命令 使用 -e参数
sort [选项] 文件名 选项:
-f: 忽略大小写
-b: 忽略每行前面的空白部分
-n: 以数值型进行排序,默认使用字符串型排序
-r: 反向排序
-u: 删除重复行。就是 uniq 命令
-t: 指定分隔符,默认是分隔符是制表符
-k n[,m]: 按照指定的字段范围排序。从第 n 字段开始,m 字段结束(默认到行尾)
sort /etc/passwd #排序用户信息文件
sort -r /etc/passwd #反向排序
sort -t ":" -k 3,3 /etc/passwd 使用:分割每行,并用第三个字段排序
sort -n -t ":" -k 3,3 /etc/passwd 将第三个字段转为数值再排序
uniq
uniq 命令是用来取消重复行的命令,其实和“sort -u”选项是一样的。命令格式如下:
[root@localhost ~]# uniq [选项] 文件名 选项:
-i: 忽略大小写
统计命令 wc
[root@localhost ~]# wc [选项] 文件名 选项:
-l: 只统计行数
-w: 只统计单词数
-m: 只统计字符数