Linux三剑客

文档一:
aaa.txt内容如下
2018-11-26
hello world!
192.168.136.128
192.168.136.129
20181127
2018-12-12
2018-11-11
aaa bbb
文档二:
student.txt内容如下
ID Name gender Mark
1 youyou women 59
2 abin man 60
3 tangge women 98
一、grep:
1.正则表达式--grep
正则匹配日期: grep '[0-9]{4}-[0-9]{2}-[0-9]{2}' aaa.txt
正则匹配IP: grep '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' aaa.txt
2.Cut --过滤文件中的内容
使用grep查询出想要的内容,然后使用管道二次过滤:
Cut: cut [选项] 文件名
选项:
-f 列号:提取第几列
-d 分隔符:按照指定分隔符分割列
注意:默认分隔符是制表符 --tab
取出student.txt第2列数据: cut -f 2 student.txt
取出student.txt第2,4列数据: cut -f 2,4 student.txt
取出非root用户的用户名: grep "/bin/bash" /etc/passwd | grep -v "root" | cut -f 1 -d ":"
cut命令的局限:
cut取不出非同一分隔符的字段:如 df -h | cut -d " " -f 1,3
 
二、printf:(为awk铺垫
 
输出格式:
[hadoop@hadoop1 test]$ printf %s 1 2 3 4 5 6
123456[hadoop@hadoop1 test]$ printf '%s ' 1 2 3 4 5 6
1
2
3
4
5
6
[hadoop@hadoop1 test]$ printf '%s %s %s ' 1 2 3 4 5 6
1 2 3
4 5 6
输出文件:
不调整任何输出格式:
[hadoop@hadoop1 test]$ printf '%s' $(cat student.txt)
IDNamegenderMark1youyouwomen592abinman603tanggewomen98
调整格式后:
[hadoop@hadoop1 test]$ printf '%s %s %s %s ' $(cat student.txt)
ID Name gender Mark
1 youyou women 59
2 abin man 60
3 tangge women 98
三、awk:
在awk命令的输出中支持print和printf命令
print:print会在每个输出之后自动加入一个换行符(Linux默认没有print命令)
printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符
 
awk '条件1{动作1} 条件2{动作2}........' 文件名
条件:
一般使用关系表达式作为条件
x > 10 判断变量 x是否大于10
x >= 10 大于等于
x <- 10 小于等于
动作:
格式化输出
流程控制语句
 
使用awk输出student.txt第2,4列: cut -f 2,4 student.txt
强大的awk弥补了cut的缺陷:
awk-BEGIN: 在第一个动作之前加入一个执行一次的动作
[hadoop@hadoop1 test]$ awk 'BEGIN{printf "This is a transcript "}{printf $2 " " $4 " "}' student.txt
This is a transcript
Name Mark
youyou 59
abin 60
tangge 98
awk-END: 在最后一个动作之后加入一个执行一次的动作
[hadoop@hadoop1 test]$ awk 'END{printf "The End "}{printf $2 " " $4 " "}' student.txt
Name Mark
youyou 59
abin 60
tangge 98
 
The End
 
awk 对文本的扫描是依行为单位, 这样就产生了一个问题怎么在扫描的开始以及结束之后的执行一些操作?
awk BEGIN{} 是在文件开始扫描前进行的操作 END {} 是扫描结束后 进行的操作 ;一般的操作都是需要在BEGIN 设置一个初始的量
shell 换行的使用
eg:
 
awk_test.txt
 
1 line1 field1
2 line2 field2
3 line3 field3
4 line4 field4
5 line5 field5
6 line6 field6
7 line7 field7
8 line8 field8
9 line9 field9
10 line10 field10
11 line11 field11
 
awk 'BEGIN{print "地点 ";total=0;} {print $3;total = total+NR} END{printf "行数总计: %2d ", total}' awk_test.txt
 
四、sed:
sed是一种几乎包括在所有UNIX平台(包括LInux)的轻量级流编辑器,sed主要是用来将数据进行选取,替换,删除,新增的命令.
sed [选项] '[动作]' 文件名
选项:
-n :一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会吧经过sed命令处理的行输出到屏幕
-e :允许对输入数据应用多条sed命令编辑
-i :用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作:
a :追加,在当前行后添加一行或者多行
c :行替换,用c后面的字符串替换原数据行
i :插入,在当前行前插入一行或者多行,
d:删除,删除指定的行
p :打印,输出指定的行
s :字符串替换,用一个字符串替换另一个字符串,格式为 "行范围s/旧字符串/新字符串/g" (和vim中的替换格式类似)
 
sed行数据操作:
查看文件的第二行:
[hadoop@hadoop1 test]$ sed -n '2p' student.txt
删除第2-4行的数据,但不修改文件本身:
[hadoop@hadoop1 test]$ sed '2,4d' student.txt
删除第2-4行的数据,修改文件本身:
[hadoop@hadoop1 test]$ sed -i '2,4d' student.txt
在第二行后追加hello world! 不对原文件做编辑:
sed '2a hello world!' student.txt
在第二行后追加hello world! 对原文件做编辑:
sed -i '2a hello world!' student.txt
在第二行前插入两行数据:
sed -i '2i hello world!' student.txt
替换第二行数据:
替换字符串:
sed 's/旧字符串/新字符串/g' 文件名
替换第五行数据60为99
同时替换youyou 和 abin 为空和为--:
 
原文地址:https://www.cnblogs.com/gentle-awen/p/10023133.html