处理海量数据的grep、cut、awk、sed 命令

一、grep

  • grep应用场景:通常对数据进行 行的提取
  • 语法:grep [选项]...[内容]...[file]
-v 	#对内容进行取反提取

-n 	#对提取的内容显示行号

-w 	#精确匹配

-i 	#忽略大小写

^ 	#匹配开头行首

-E 	#正则匹配

grep -i user /etc/passwd

-w 是精准匹配,比如messages这种是提取不出来的,一般以空格做为分隔符

grep -E 'nginx|Daemon' /etc/passwd

 

二、处理海量数据之cut命令

  • cut应用场景:通常对数据进行列的提取
  • 语法:cut [选项]...[file]
			-d 	#指定分割符
			-f  #指定截取区域
			-c  #以字符为单位进行分割

			注意:不加-d选项,默认为制表符,不是空格
				    /bin/bash 		#代表可以登录的用户
					/sbin/nologin	#代表不可以登录的用户

			-d与-f:
			eg:以':'为分隔符,截取出/etc/passwd的第一列跟第三列
			cut -d ':' -f 1,3 /etc/passwd

			eg:以':'为分隔符,截取出/etc/passwd的第一列到第三列
			cut -d ':' -f 1-3 /etc/passwd

			eg:以':'为分隔符,截取出/etc/passwd的第二列到最后一列
			cut -d ':' -f 2- /etc/passwd

			-c:
			eg:截取/etc/passwd文件从第二个字符到第九个字符
			cut -c 2-9 /etc/passwd

 cat /etc/passwd

 

 以:为分隔符,然后取第一列和第三列

 

  取第一列到第三列:

cut -d ':' -f 1-3 /etc/passwd

取第三列到最后一列:

cut -d ':' -f  3- /etc/passwd

取第2个到第9个字符

cut -c 2-9 /etc/passwd

如果我想取第2列的第2个到第5个字符

cut -d ':' -f 1,3 /etc/passwd | cut -c 2-5

 比如领导想叫你截取linux上面所有可登陆普通用户

 

 grep '/sbin/nologin' /etc/passwd |cut -d ':' -f 1 |grep -v tss   类似这样的写法  先取行,再取列

 

三、awk

  • awk的应用场景:通常对数据进行列的提取(和cut差不多)
  • 语法:
awk '条件 {执行动作}'文件名

awk '条件1 {执行动作} 条件2 {执行动作} ...' 文件名

或awk [选项] '条件1 {执行动作} 条件2 {执行动作} ...' 文件名

 

  • 特殊要点与举例说明:
  • print linux 是没有这个的,需要与awk联合使用
				printf	#格式化输出,不会自动换行。
					  (%ns:字符串型,n代表有多少个字符; 
					    %ni:整型,n代表输出几个数字;
					    %.nf:浮点型,n代表的是小数点后有多少个小数
					    )

				print 	#打印出内容,默认会自动换行

				\t  	#制表符
				\n  	#换行符

					eg:printf '%s\t%s\t%s\t%s\t%s\t%s\n' 1 2 3 4 5 6

					eg:df -h |grep /dev/vda1 | awk '{printf "/dev/vda1的使用率是:"} {print $5                           }'

						小数:echo "scale=2; 0.13 + 0.1" | bc | awk '{printf "%.2f\n", $0}'

				$1 		#代表第一列
				$2 		#代表第二列
				$0 		#代表一整行

					eg: df -h | grep /dev/vda1 | awk '{print $5}'



				-F 		#指定分割符
					eg:cat /etc/passwd | awk -F":" '{print $1}'



				BEGIN 	#在读取所有行内容前就开始执行,常常被用于修改内置变量的值
				FS		#BEGIN时定义分割符

					eg:cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1}'

				END 	#结束的时候 执行

				NR 		#行号

					eg:df -h | awk 'NR==2 {print $5}'
						awk '(NR>=20 && NR<=30) {print $1}' /etc/passwd

printf  %s 格式化输出 ,如下图\t 制表符  \n 换行符

 

 awk 条件1 {执行动作}  条件2   {执行动作}   也可以没有条件  文件名

或者 加上选项   awk [选项] 条件1 {执行动作}  条件2   {执行动作}   文件名

awk 里面的$1  $2 $3 代表是第几列,但是$0代表的是一行

 

 printf 可以格式化输出

 

 我们直接用bc时,发现0不能输入出来,那么我们可以用awk去解决这个问题

 

 

 

 加逗号后就成功了,固定写法先记住!

 -F #指定分割符

cat  /etc/passwd | awk -F ':' '{print $1,$3}'

BEGIN  和 END  

BEGIN  #在读取所有行内容前就开始执行,常常被用于修改内置变量的

cat /etc/passwd|awk 'BEGIN {FS=":"} {print $4}'   //这里相当于-F

END  #结束的时候 执行

cat /etc/passwd|awk 'BEGIN {FS=":"} {print $4} END {print "哎,真的是...."}'

指定行号

NR==2

 

 建议写awk 时,用统一格式  awk 'BEGIN {} NR==2 {} END {}'

 六、sed

  • sed的应用场景:主要对数据进行处理(选取,新增,替换,删除,搜索)
  • sed语法:sed [选项][动作] 文件名
		常见的选项与参数:

				-n 	#把匹配到的行输出打印到屏幕
				p 	#以行为单位进行查询,通常与-n一起使用
					eg:df -h | sed -n '2p'

				d 	#删除  
					eg: sed '2d' df.txt

				a 	#在行的下面插入新的内容
					eg: sed '2a 1234567890' df.txt

				i 	#在行的上面插入新的内容
					eg: sed '2i 1234567890' df.txt

				c 	#替换   
					eg: sed '2c 1234567890' df.txt
				
		        s/要被取代的内容/新的字符串/g  #指定内容进行替换
		        	eg: sed 's/0%/100%/g' df.txt

				-i  #对源文件进行修改(高危操作,慎用,用之前需要备份源文件)

				搜索:在文件中搜索内容
					eg:cat -n df.txt  | sed -n '/100%/p'

				-e 	#表示可以执行多条动作
					eg:cat -n df.txt  | sed -n -e 's/100%/100%-----100%/g' -e '/100%-----100%/p'

搜索、替换、新增等 

搜索:

-n 以行为单位

-p 一般与-n 联合起来使用  2,3p表示输出第2行,第3行

 

 2-5行

 

查找某个字符串在第几行?

 

 查找某个字符串在第几行,且显示行数?

删除:

sed  '2d'  删除第二行

 

 增加:

下面插入新的内容  sed '2a'    #append

 

 上面插入新的内容 sed   '2i    sss'   insert

替换行数:

df -h |sed '2c shakxskss'              # c 是copy 的意思,用copy 去替换

替换字符串: sed 's/旧字符串/新字符串/g'     s是字符串的意思

 

 -e 执行多条命令

我们发现结果其实并没有替换成100%---100%,这是由于第一个sed -n -e 会打印在屏幕上,第二个-e 会替换,但是不会显示在屏幕上

 

 换一种写法就可以了,将-n 写在最后面

 

 

小结:

grep:
    场景:取行
	查询:
		grep  name   文件
		grep  -i  忽略大小写
		      -w  精准匹配
			  ^ 行首匹配
			  -v  取反
			  -E  正则匹配
cut:
	场景:取列
	cut -d ":" 分隔符
	cut -f 1,2
		-f 1-3 
	cut -d ":" -f 1-3 文件名
awk:
	场景:取列
	awk 'BEGIN {FS=":"} NR==2 {print $1} END {}'
	awk 'BEGIN {FS=":"} (NR>=2&&NR<=10) {print $1}END {}'
	awk '{printf "%.2f\n",$1}'
sed:
	查:
		sed -n '2p' 文件名
		sed -n '/100%/p' 文件名
	增:
		插在前面: sed '2i sffdfdfd'
		插在后面:  sed "2a ffdfdd"
	删:
		sed '2d'
	替换行:
		sed '2c sfdsfddsfdfdfd'
	替换字符串:
		sed "s\abc\dddd\g"  替换字符串和查找比较像  sed -n "/100%/p"
													sed "s/abc/ddd/g"
		-e 执行多条:
			sed -e 's/abc/eee/g' -n -e '/eee/p'

 

posted @ 2021-06-23 18:30  JakeTan  阅读(618)  评论(0)    收藏  举报