Liunx 数据流重定向 sort、sed、awk


数据流重定向

数据流重定向:当执行一个命令的时候,这个命令可能会由文件读入数据,经过处理之后,再将数据输出到屏幕上面,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 和上述的常用命令差不多可以满足日常使用中的场景了

猜你喜欢

转载自blog.csdn.net/qq_43081842/article/details/110334894