Liunx 常用操作高级篇
数据流重定向
数据流重定向:当执行一个命令的时候,这个命令可能会由文件读入数据,经过处理之后,再将数据输出到屏幕上面,standard output 与 standard error output 分别代表【标准输出】和【标准错误输出】
标准输出:命令行所返回的正确信息
标准错误输出:命令执行失败后所返回的错误信息
- 标准输入(stdin) : 代码为0, 使用 < 或者 <<
- 标准输出(stdout) : 代码为1,使用 > 或者 >>
- 标准错误输出(stderr) : 代码为2,使用 2> 或者 2>>
上述代码的含义:
- 1>:以覆盖的方法将【正确的数据】输出到指定文件或者设备上面
- 1>>:以累加的方式将【正确的数据】输出到指定文件或者设备上面
- 2>:以覆盖的方法将【错误的数据】输出到指定文件或者设备上面
- 2>>:以累加的方法将【错误的数据】输出到指定文件或者设备上面
案例:
# 下面的命令输出了正确的日志信息和错误的日志信息
[hadoop@bigdata01 tmp]$ find /home -name .bashrc
find: ‘/home/ruoze’: Permission denied
/home/hadoop/.bashrc
find: ‘/home/azkaban’: Permission denied
# 分别输出正确信息和错误信息到不同的文件,执行命令会输出正确日志和错误日志
find /home -name .bashrc > right.out 2>error.out
# 将错误日志和正确日志写到一个文件中且保证日志输出的顺序
find /home -name .bashrc > all.out 2>&1 -- 推荐使用
find /home -name .bashrc &> all.out
sort 命令使用
sort 可以帮助我们进行排序,而且可以根据指定的数据形式进行排序,例如数字和文字的排序就不一样
[root@bigdata01 ~]# sort --help
Usage: sort [OPTION]... [FILE]...
or: sort [OPTION]... --files0-from=F
-b, --ignore-leading-blanks 忽略最前面空格字符部分
-f, --ignore-case 忽略大小写的差异
-k, --key=KEYDEF 以哪个区间来进行排
-r, --reverse 反向排序
-u, --unique uniq,相同的数据只出现一行
-t, --field-separator=SEP 分割符号,就是以【Tab】键进行分割
-n, --numeric-sort 以【纯数字】进行排序,(默认是使用文字形式进行排序)
。。。。
uniq 使用:
[root@bigdata01 ~]# uniq --help
Usage: uniq [OPTION]... [INPUT [OUTPUT]]
-c, --count 进行计数
-i, --ignore-case 忽略大小写
案例:
[hadoop@bigdata01 tmp]$ cat test3.txt
hadoop
hadoop
hadoop
spark
spark
spark
[hadoop@bigdata01 tmp]$ cat test3.txt | uniq
hadoop
spark
wc 使用:
[root@bigdata01 ~]# wc --help
Usage: wc [OPTION]... [FILE]...
-c, --bytes 统计字节数
-m, --chars 统计字符数
-l, --lines 列出多少行
案例:
[hadoop@bigdata01 tmp]$ cat test.txt |wc
16 16 227
[hadoop@bigdata01 tmp]$ cat test.txt |wc -l
16
[hadoop@bigdata01 tmp]$ cat test.txt |wc -m
227
[hadoop@bigdata01 tmp]$ cat test.txt |wc -w
16
sed 命令简单使用
sed是一种流编辑器,它是文本处理中非常好的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件,可以将数据行进行替换、删除、新增、选取等特定工作,简化对文件的反复操作,编写转换程序等。
sed的命令格式:sed [options] 'command' file(s);
sed的脚本格式:sed [options] -f scriptfile file(s);
参数:
-e :直接在命令行模式上进行sed动作编辑,此为默认选项;
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;
-i :直接修改文件内容;
-n :只打印模式匹配的行;
-r :支持扩展表达式;
-h或--help:显示帮助;
-V或--version:显示版本信息。
sed常用命令
a\ 在当前行下面插入文本;
i\ 在当前行上面插入文本;
c\ 把选定的行改为新的文本;
d 删除,删除选择的行;
D 删除模板块的第一行;
s 替换指定字符;
案例:
# 替换指定的内容
[root@bigdata01 tmp]# cat test3.txt
HADOOP
HADOOP
HADOOP
spark
spark
spark
[root@bigdata01 tmp]# sed 's/HADOOP/hadoop/g' test3.txt ==> 不会替换原文件呢中内容
hadoop
hadoop
hadoop
spark
spark
spark
[root@bigdata01 tmp]# cat test3.txt
HADOOP
HADOOP
HADOOP
spark
spark
spark
[root@bigdata01 tmp]# sed -i 's/HADOOP/hadoop/g' test3.txt ==> 替换原文件中的内容
[root@bigdata01 tmp]# cat test3.txt
hadoop
hadoop
hadoop
spark
spark
spark
[root@bigdata01 tmp]#
数据搜索并显示:
[root@bigdata01 tmp]# clear
[root@bigdata01 tmp]# nl test.txt |sed '2,5d' ===> 不显示2行和5行
1 1,hadoopdoophadoophaoddop,3
6 6,flume,56
7 7,kylin,2
8 8,es,1
9 9,hadoop,4
10 10,hadoop,12
11 11,flink,6
12 12,flink,4
13 13,spark,4
14 14,spark,56
15 15,spark,22
16 16,spark,33
[root@bigdata01 tmp]# nl test.txt |sed '3,$d' ===> 不显示第三行到最后一行
1 1,hadoopdoophadoophaoddop,3
2 2,flinflinkflinkflinkflinkk,5
[root@bigdata01 tmp]# nl test.txt |sed '2,$d' ===> 不显示第二行到最后一行,只显示第一行
1 1,hadoopdoophadoophaoddop,3
awk 常用命令使用
awk是一个强大的文本分析工具,简单来说awk就是把文件逐行读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理。
相对比于sed常用用作一整行数据的处理,awk则比较倾向于一行当中分成数个字段来处理,因此awk 相当适合处理小型的文本数据
awk [-F field-separator] 'commands' input-file(s)
awk '条件类型1{操作1} 条件类型2{操作2}...' filename
【-F 分隔符】是可选的,因为awk使用空格,制表符作为缺省的字段分隔符,因此如果要浏览字段间有空格,制表符的文本,不必指定这个选项,但如果要浏览诸如/etc/passwd文件,此文件各字段以冒号作为分隔符,则必须指明-F选项
- NF:每一行($0) 拥有的字段数
- NR:目前awk所处在的行数
- FS:目前的分割字符,默认是空格键
# 原始数据文件
[root@bigdata01 tmp]# cat tmpdata.txt
1,hadoop,23323
2,spark,234244
3,kafka,897373
4,scrip,123947
5,bangk,627449
6,hadoop,13445
7,hadoop,23454
# 使用awk进行处理 -F指定分隔符 $1 为第一列 $2 为第二列 ,FS默认为空格,NF每一行的字段数,NR 第几行
[root@bigdata01 tmp]# cat tmpdata.txt |awk -F ',' '{print $1 "\t" $2 FS "\t" NF "\t" NR}'
1 hadoop, 3 1
2 spark, 3 2
3 kafka, 3 3
4 scrip, 3 4
5 bangk, 3 5
6 hadoop, 3 6
7 hadoop, 3 7
# 输出文件中的第二行并去重
[root@bigdata01 tmp]# cat tmpdata.txt |awk -F ',' '{print $2}'| uniq
hadoop
spark
kafka
scrip
bangk
hadoop
[root@bigdata01 tmp]#
# 输出文件中的第二行,按照第二行统计单词并去重,统计去重后的个数
[root@bigdata01 tmp]# cat tmpdata.txt |awk -F ',' '{print $2}'| uniq | wc -l
6
结合awk 和上述的常用命令差不多可以满足日常使用中的场景了