处理海量数据的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'

浙公网安备 33010602011771号