管道相关命令
目标
cut
sort
wc
uniq
tee
tr
split
awk
sed
grep
- 准备工作
zhangsan 68 99 26 lisi 98 66 96 wangwu 38 33 86 zhaoliu 78 44 36 maq 88 22 66 zhouba 98 44 46
- 以上是成绩表信息
- 使用 逗号 分割, 第一列 是 姓名, 第二列是 语文成绩, 第三列是 数学成绩, 第四列是 英语成绩
准备工作
vim 1.txt
111:aaa:bbb:ccc 222:ddd:eee:fff 333:ggg:hhh 444:iii
1 cut
1.1 目标
cut
根据条件 从命令结果中 提取 对应内容
1.2 实现
第一步: 截取出1.txt文件中前2行的第5个字符
命令 | 含义 |
cut 动作 文件 | 从指定文件 截取内容 |
- 参数
参数 | 英文 | 含义 |
-c | characters | 按字符选取内容 |
head -2 1.txt | cut -c 5
第二步: 截取出1.txt文件中前2行以”:”进行分割的第1,2段内容
参数 | 英文 | 含义 |
-d '分隔符' |
delimiter | 指定分隔符 |
-f n1,n2 |
fields | 分割以后显示第几段内容, 使用 , 分割 |
范围控制
范围 | 含义 |
n |
只显示第n项 |
n- |
显示 从第n项 一直到行尾 |
n-m |
显示 从第n项 到 第m项(包括m) |
head -2 1.txt | cut -d ':' -f 1,2
head -2 1.txt | cut -d ':' -f 1-2
1.3 小结
- 通过
cut 动作 目标文件
可以根据条件 提取对应内容 - 准备工作
vim score.txt
zhangsan 68 99 26 lisi 98 66 96 wangwu 38 33 86 zhaoliu 78 44 36 maq 88 22 66 zhouba 98 44 46
2 sort
2.1 目标
- sort可针对文本文件的内容,以行为单位来排序。
2.2 路径
- 第一步: 对字符串排序
- 第二步: 去重排序
- 第三步: 对数值排序
- 第四步: 对成绩排序
2.3 实现
第一步: 对字符串排序
[root@node01 tmp]# cat 2.txt banana apple pear orange pear [root@node01 tmp]# sort 2.txt apple banana orange pear pear
第二步: 去重排序
参数 | 英文 | 含义 |
-u |
unique | 去掉重复的 |
它的作用很简单,就是在输出行中去除重复行。
[root@node01 tmp]# sort -u 2.txt apple banana orange pear
第三步: 对数值排序
参数 | 英文 | 含义 |
-n |
numeric-sort | 按照数值大小排序 |
-r |
reverse | 使次序颠倒 |
- 准备数据
[root@node01 tmp]# cat 3.txt 1 3 5 7 11 2 4 6 10 8 9
- 默认按照
字符串
排序
[root@node01 tmp]# sort 2.txt 1 10 11 2 3 4 5 6 7 8 9
- 升序
[root@node01 tmp]# sort -n 2.txt 1 2 3 4 5 6 7 8 9 10 11
- 倒序
[root@node01 tmp]# sort -n -r 2.txt 11 10 9 8 7 6 5 4 3 2 1
- 合并式
[root@node01 tmp]# sort -nr 2.txt 11 10 9 8 7 6 5 4 3 2 1
第四步: 对成绩排序
参数 | 英文 | 含义 |
-t |
field-separator | 指定字段分隔符 |
-k |
key | 根据那一列排序 |
‘’
# 根据第二段成绩 进行倒序显示 所有内容 sort -t ',' -k2nr score.txt
3 wc命令
3.1 目标
- 显示指
3.2 路径
- 第一步: 显示指定文件字节数, 单词数, 行数 信息.
- 第二步: 只显示 文件 的行数
- 第三步: 统计多个文件的 行数 单词数 字节数
- 0第四步: 查看
/etc
目录下 有多少个 子内容
3.3 实现
第一步: 显示指定文件字节数, 单词数, 行数 信息.
命令 | 含义 |
wc 文件名 | 显示指定文件字节数, 单词数, 行数 信息 |
[root@hadoop01 export]# cat 4.txt 111 222 bbb 333 aaa bbb 444 aaa bbb ccc 555 aaa bbb ccc ddd 666 aaa bbb ccc ddd eee [root@hadoop01 export]# wc 4.txt 6 21 85 4.txt
第二步: 只显示 文件 的行数
参数 | 英文 | 含义 |
-c |
bytes | 字节数 |
-w |
words | 单词数 |
-l |
lines | 行数 |
[root@hadoop01 export]# wc 4.txt 6 21 85 3.txt
第三步: 统计多个文件的 行数 单词数 字节数
[root@hadoop01 export]# wc 1.txt 2.txt 3.txt 4 4 52 1.txt 11 11 24 2.txt 6 21 85 3.txt 21 36 161 总用量 [root@hadoop01 export]# wc *.txt 4 4 52 1.txt 11 11 24 2.txt 6 21 85 3.txt 6 6 95 score.txt 27 42 256 总用量
第四步: 查看 /etc
目录下 有多少个 子内容
[root@hadoop01 export]# ls /etc | wc -w 240
3.4 小结
- 通过
wc 文件
就可以 统计 文件的 字节数、单词数、行数.
4 uniq
uniq 命令用于检查及删除文本文件中重复出现的行,一般与 sort 命令结合使用。
4.1 目标
4.2路径
- 第一步:实现去重效果
- 第二步:不但去重,还要 统计出现的次数
4.3 实现
第一步:实现去重效果
命令 | 英文 | 含义 |
uniq [参数] 文件 |
unique 唯一 | 去除重复行 |
# 准备内容 [root@hadoop01 export]# cat 5.txt 张三 98 李四 100 王五 90 赵六 95 麻七 70 李四 100 王五 90 赵六 95 麻七 70 # 排序 [root@hadoop01 export]# cat 5.txt | sort 李四 100 李四 100 麻七 70 麻七 70 王五 90 王五 90 张三 98 赵六 95 赵六 95 # 去重 [root@hadoop01 export]# cat 5.txt | sort | uniq 李四 100 麻七 70 王五 90 张三 98 赵六 95
第二步:不但去重,还要 统计出现的次数
参数 | 英文 | 含义 |
-c |
count | 统计每行内容出现的次数 |
[root@hadoop01 export]# cat 5.txt | sort | uniq -c 2 李四 100 2 麻七 70 2 王五 90 1 张三 98 2 赵六 95
4.4 小结
- 通过
uniq [选项] 文件
就可以完成 去重行 和 统计次数
5 tee
5.1 目标
- 通过
tee
可以将命令结果 通过管道 输出到 多个文件中
5.2 实现
命令 | 含义 |
命令结果 | tee 文件1 文件2 文件3 | 通过 tee 可以将命令结果 通过管道 输出到 多个文件中 |
cat 5.txt | sort | uniq -c | tee a.txt b.txt c.txt
5.3 小结
- 通过
tee
可以将命令结果 通过管道 输出到 多个文件中
6 tr
spark
6.1 目标
- 通过
tr
命令用于 替换 或 删除 文件中的字符。
6.2 路径
- 第一步: 实现 替换 效果
- 第二步: 实现 删除 效果
- 第三步: 完成 单词计数 案例
6.3 实现
第一步: 实现 替换效果
命令 | 英文 | 含义 |
命令结果 | tr 被替换的字符 新字符 | translate | 实现 替换效果 |
# 将 小写i 替换成 大写 I # 把itheima的转换为大写 # 把 HELLO 转成 小写
# 将 小写i 替换成 大写 I echo "itheima" | tr 'i' 'I' # 把itheima的转换为大写 echo "itheima" |tr '[a-z]' '[A-Z]' # 把 HELLO 转成 小写 echo "HELLO" |tr '[A-Z]' '[a-z]'
第二步: 实现删除效果
命令 | 英文 | 含义 |
命令结果 | tr -d 被删除的字符 | delete | 删除指定的字符 |
- 需求: 删除abc1d4e5f中的数字
echo 'abc1d4e5f' | tr -d '[0-9]'
第三步: 单词计数
准备工作
[root@hadoop01 export]# cat words.txt hello,world,hadoop hive,sqoop,flume,hello kitty,tom,jerry,world hadoop
1 将, 换成 换行
2 排序
3 去重
4 计数
# 统计每个单词出现的次数 [root@hadoop01 export]# cat words.txt | tr ',' '\n' | sort | uniq -c 1 flume 2 hadoop 2 hello 1 hive 1 jerry 1 kitty 1 sqoop 1 tom 2 world
- 准备工作
# 查看 /etc目录下 以.conf以结尾的文件的内容 cat -n /etc/*.conf # 将命令结果 追加到 /export/v.txt 文件中 cat -n /etc/*.conf >> /export/v.txt
7 split
7.1 目标
- 通过
split
命令将大文件切分成 若干小文件
7.2 路径
- 第一步: 按 字节 将 大文件 切分成 若干小文件
- 第二步: 按 行数 将 大文件 切分成 若干小文件
7.3 实现
第一步: 按 字节 将 大文件 切分成 若干小文件
命令 | 英文 | 含义 |
split -b 10k 文件 | byte | 将大文件切分成若干10KB的小文件 |
第二步: 按 行数 将 大文件 切分成 若干小文件
命令 | 英文 | 含义 |
split -l 1000 文件 | lines | 将大文件切分成若干1000行 的小文件 |
7.4 小结
- 通过
split 选项 文件名
命令将大文件切分成 若干小文件 - 准备工作1:
vim score.txt
zhangsan 68 99 26 lisi 98 66 96 wangwu 38 33 86 zhaoliu 78 44 36 maq 88 22 66 zhouba 98 44 46
8 awk
8.1 目标
- 通过
awk
实现 模糊查询, 按需提取字段, 还可以进行 判断 和 简单的运算等.
8.2 步骤
- 第一步: 模糊查询
- 第二步: 指定分割符, 根据下标显示内容
- 第三步: 指定输出字段的分割符
- 第四步: 调用 awk 提供的函数
- 第五步: 通过if语句判断$4是否及格
- 第六步: 段内容 求和
8.3 实现
第一步: 搜索 zhangsan 和 lisi 的成绩
命令 | 含义 |
awk ‘/zhangsan|lisi/’ score.txt | 模糊查询 |
第二步: 指定分割符, 根据下标显示内容
命令 | 含义 |
awk -F ‘,’ ‘{print $1, $2, $3}’ 1.txt | 操作1.txt文件, 根据 逗号 分割, 打印 第一段 第二段 第三段 内容 |
选项
选项 | 英文 | 含义 |
-F ',' |
field-separator | 使用 指定字符 分割 |
$ + 数字 |
获取第几段内容 | |
$0 |
获取 当前行 内容 | |
NF |
field | 表示当前行共有多少个字段 |
$NF |
代表 最后一个字段 | |
$(NF-1) |
代表 倒数第二个字段 | |
NR |
代表 处理的是第几行 |
第三步: 指定分割符, 根据下标显示内容
命令 | 含义 |
awk -F ’ ’ ‘{OFS="==="}{print $1, $2, $3}’ 1.txt | 操作1.txt文件, 根据 逗号 分割, 打印 第一段 第二段 第三段 内容 |
选项
选项 | 英文 | 含义 |
OFS="字符" |
output field separator | 向外输出时的段分割字符串 |
第四步: 调用 awk 提供的函数
命令 | 含义 |
awk -F ‘,’ ‘{print toupper($2)}’ 1.txt | 操作1.txt文件, 根据 逗号 分割, 打印 第一段 第二段 第三段 内容 |
常用函数如下:
函数名 | 含义 | 作用 |
toupper() | upper | 字符 转成 大写 |
tolower() | lower | 字符 转成小写 |
length() | length | 返回 字符长度 |
第五步: if语句 查询及格的学生信息
命令 | 含义 |
awk -F ‘,’ ‘{if($4>60) print $1, $4 }’ score.txt | 如果及格,就显示 $1, $4 |
awk -F ‘,’ ‘{if($4>60) print $1, $4, “及格”; else print $1, $4, “不及格”}’ score.txt | 显示 姓名, $4, 是否及格 |
选项
参数 | 含义 |
if($0 ~ “aa”) print $0 | 如果这一行包含 “aa”, 就打印这一行内容 |
if($1 ~ “aa”) print $0 | 如果**第一段 **包含 “aa”, 就打印这一行内容 |
if($1 == “lisi”) print $0 | 如果第一段 等于 “lisi”, 就打印这一行内容 |
第六步: 段内容 求学科平均分
命令 | 含义 |
awk ‘BEGIN{初始化操作}{每行都执行} END{结束时操作}’ 文件名 | BEGIN{ 这里面放的是执行前的语句 } {这里面放的是处理每一行时要执行的语句} END {这里面放的是处理完所有的行后要执行的语句 } |
awk -F ',' 'BEGIN{}{total=total+$4}END{print total, NR, (total/NR)}' score.txt
- 准备工作
vim 1.txt
aaa java root bbb hello ccc rt ddd root nologin eee rtt fff ROOT nologin ggg rttt
9 sed
9.1 目标
- 通过 sed 可以实现 过滤 和 替换 的功能.
9.2 路径
- 第一步: 实现 查询 功能
- 第二步: 实现 删除 功能
- 第三步: 实现 修改 功能
- 第四步: 实现 替换 功能
- 第五步: 对 原文件 进行操作
- 第六步: 综合 练习
9.3 实现
第一步: 实现 查询 功能
命令 | 含义 |
sed 可选项 目标文件 | 对目标文件 进行 过滤查询 或 替换 |
可选参数
可选项 | 英文 | 含义 |
p | 打印 | |
$ | 代表 最后一行 | |
-n |
仅显示处理后的结果 | |
-e |
expression | 根据表达式 进行处理 |
sed -n -e '1,5p' 1.txt
sed -n -e '1,$p' 1.txt
可选项 | 含义 |
= | 打印当前行号 |
sed -n -e '1,$=' -e '1,$p' 1.txt 简化版 cat -n 1.txt cat -b 1.txt nl 1.txt
答案:
sed -n -e '/root/p' 1.txt
可选项 | 英文 | 含义 |
I | ignore | 忽略大小写 |
答案:
nl 1.txt | sed -n -e '/root/Ip' nl 01.txt | grep -i root cat -n 01.txt | grep -i root
可选项 | 英文 | 含义 |
-r |
regexp-extended | 识别正则 |
答案:
nl 01.txt | sed -nr -e '/r+t/p'
或者
sed -nr -e '/r+t/p' -e '/r+t/=' 01.txt
第二步: 实现 删除 功能
可选项 | 英文 | 含义 |
d |
delete | 删除指定内容 |
答案:
nl 01.txt | sed -e '1,3d'
答案:
nl 01.txt | sed -e '5,$d' nl 1.txt | sed -n -e '1,4p'
第三步: 实现 修改 功能
参数 | 英文 | 含义 |
i | insert | 目标前面 插入内容 |
a | append | 目标后面 追加内容 |
答案:
nl 01.txt | sed -e '2a aaaaa'
答案:
nl 01.txt | sed -e '1i bbbbb'
第四步: 实现 替换 功能
英文 | 含义 | |
s/oldString/newString/ | replace | 替换 |
答案:
nl 1.txt | sed -e 's/nologin/huawei/'
选项 | 英文 | |
2c 新字符串 |
replace | 使用新字符串 替换 选中的行 |
答案:
nl passwd | sed -e '1,2c aaa'
第五步: 对 原文件 进行操作
参数 | 英文 | 含义 |
-i | in-place | 替换原有文件内容 |
答案:
sed -i -e 's/nologin/huawei/' 01.txt
答案:
sed -i -e '2,3c aaa' 01.txt
注意:在进行操作之前,最好是对数据进行备份,放置操作失误,数据无法恢复!
答案:
sed -i -e '1,2d' 01.txt nl passwd 查看数据
第六步: 综合 练习
答案:
ifconfig eth0 | grep "inet addr" | sed -e 's/^.*inet addr://' | sed -e 's/Bcast:.*$//'
答案:
nl 01.txt | grep 'root' | sed -e 's/nologin/itheima/' 或者 nl 01.txt | sed -n -e '/root/p' | sed -e 's/nologin/itheima/' 或者 nl 01.txt | sed -n -e '/root/{s/nologin/itheima/p}' #只显示替换内容的行
答案:
nl 01.txt | sed -e '1,2d' | sed -e 's/nologin/itheima/'