grep和egrep
- 第一种形式:
grep [option] [pattern] [file1 file2 ...]
- 第二种形式:
command | grep [option] [patern]
- 选项:option
-v
不显示匹配行grep -v python file
-i
搜索时忽略大小写-n
显示行号grep -n python file
匹配显示文件file中包含python的行号
-r
递归搜索-E
支持扩展正则表达式-F
不按正则表达式匹配,按照字符串字面意思匹配-c
只显示匹配行总数-W
匹配整词-x
匹配整行-l
只显示文件名,不显示内容-s
不显示错误信息
sed命令
简介
- sed(Stream Editor), 流编辑器。对标准输出或文件逐行进行处理。
语法格式
- 第一种形式:
stdout | sed [option] "pattern command"
- 第二种形式:
sed [option] "pattern command" file
sed的option选项
-n
只打印模式匹配行sed -n '/python/p' sed.txt
匹配sed.txt文件中, 包含python字符串的行,并打印匹配的行
-e
直接在命令行进行sed编辑,默认选项sed -n -e '/python/p' -e '/PYTHON/p' sed.txt
-f
编辑动作保存在文件中,指定文件执行sed -n -f edit.sed sed.txt
-r
支持扩展正则表达式sed -n -r '/python|PYTHON/p' sed.txt
-i
直接修改文件内容sed -n 's/love/like/g;p' sed.txt
对sed.txt文件,把love替换成like并打印sed -i 's/love/like/g' sed.txt
修改sed.txt文件,把love替换成like
sed的pattern模式
10command
匹配到第10行sed -n "17p" file
打印file文件的17行
10,20command
匹配从第10行开始,到第20行结束sed -n "10, 20p" file
打印file文件的第10到20行
10,+5command
匹配从第10行开始,到第16行结束sed -n "10, +5p" file
打印file文件中从第10行开始,往后面加5行的所有行
/pattern1/command
匹配到pattern1的行sed -n "/^root/p" file
打印file文件中以root开头的行sed -n "/\/sbin\/nologin/p" /etc/passwd
打印/etc/passwd中以/sbin/nologin的行
/pattern1/,/pattern2/command
匹配到pattern1的行开始,到匹配到pattern2的行结束sed -n '/^hgds/,/^yarn/p' /etc/passwd
打印/etc/passwd文件中匹配以hgds开头的行,到yarn开头的行结束
10,/pattern1/command
匹配从第10行开始,到匹配到pattern1的行结束sed -n '4,/^hdfs/p' /etc/passwd
匹配/etc/passwd文件中,从第4行开始,直到hdfs开头的行结束
/pattern1/,10command
匹配到pattern1的行开始,到第10行匹配结束sed -n '/root/, 10p' /etc/passwd
匹配/etc/passwd文件中,以root开头的行,到第10行结束
sed中编辑命令command详解
查询
p
打印
增加
a
行后追加sed -i '/\bin\/bash/a This is user which can login to system' file
匹配file文件中,以/bin/bash的行,并在行后追加This is user which can login to system这句
i
行前打印sed -i '/^hdfs/,/^yarn/i aaa' file
匹配file文件中,以hdfs开头的到yarn开头的行结束,并在匹配的行前追加aaa
r
外部文件读入,行后追加sed -i '/root/r read.file' file
匹配file文件中,读取read.file的内容追加到,以root开头的行后
w
匹配行写入外部文件sed -i '/\bin\/bash/w writefile.txt' file
将匹配file文件中, 以/bin/bash的行另存到writefile.txt文件中
删除
d
删除sed '1d' file
删除file文件第一行sed '1,3d' file
删除file文件第一行到第三行sed -i '/\/sbin\/nologin/d' file
删除file文件,匹配/sbin/nologin的行sed -i '/^mail/,/^ftp/d file'
删除file文件中,匹配以mail开头的行,直到ftp开头的行结束sed -i '/^[:blank:]*#/d,/^$/d' /etc/nginx.conf
删除/etc/nginx.conf文件中,空格和注释行
修改
s/old/new
将行内第一个old替换为newsed -i 's/root/ROOT' file
匹配file文件中,替换第一个以root的行为ROOT
s/old/new/g
将行内全部的old替换为newsed -i 's/\/bin\/bash/\/BIN\/BASH/g' file
匹配file文件中,将所有/bin/bash替换成/BIN/BASH的行
s/old/new/2g
将行内从第2个开始,到剩下所有的old替换为newsed -i 's/root/ROOT/2g' file
匹配file文件中,同一行内替换以第二个root的行到剩下所有的内容为ROOT
s/old/new/ig
将行内old全部替换为new,忽略大小写sed -i 's/root/ROOT/ig' file
匹配file文件中,同一行内,所有以root的行,并替换为ROOT,不区分大小写sed -i 's/^[^#]/\*&/g' etc/nginx.conf
示例
# 修改/etc/passwd中第一行第一个root为ROOT
sed -i '1s/root/ROOT' /etc/passwd
# 修改/etc/passwd中第5行到第10行中所有的/sbin/nologin为/bin/bash
sed -i '5,10s/\/sbin\/nologin/\/bin\/bash/g' /etc/passwd
# 修改/etc/passwd中匹配到/sbin/nologin的行,将匹配到行的login改为大写的LOGIN
sed -i '/\/sbin\/nologin/s/login/LOGIN' /etc/passwd
# 修改/etc/passwd中从匹配以root开头的行,到匹配到行中包含mail的所有行,修改内容为将这些所有匹配到的行的bin改为HADOOP
sed -i '/^root/, /mail/s/bin/HADOOP/g' /etc/passwd
# 修改/etc/passwd中匹配以root开头的行,到第15行中所有的行,修改内容为将这些行中的bin改为HADOOP
sed -i '/root/,15s/bin/HADOOP/g' /etc/passwd
# 修改/etc/passwd中从第15行开始,到匹配到yarn开头的所有行,修改内容为将这些行中的bin改为HADOOP
sed -i '15,/^yarn/s/bin/HADOOP/g' /etc/passwd
# 在/etc/passwd文件每一行前面追加Insert Line Before Every Line
sed -i 'i Insert Line Before Every Line' /etc/passwd
其他命令
=
显示行号sed -n '/\sbin\/nologin/=' file
匹配file文件中,以/sbin/nologin的行号
反向引用
sed -i 's/had..p/&s/g' file
匹配file文件中,匹配had开始,已p结尾的字符,并在匹配的字符串后面加个ssed -i 's/\(had..p\)/\1s/g' file
匹配file文件中,匹配had开始,已p结尾的字符,并在匹配的字符串后面加个ssed -i 's/\(had\).../\1doop' file
sed中引用变量注意事项
- 匹配模式中存在变量,建议使用双引号
- sed中需要引入自定义变量时,如果外面使用单引号,则自定义变量必须使用单引号
#!/bin/bash
old_str=hadoop
new_str=HADOOP
sed -i "s/$old_str/$new_str/g" test.txt
# 方法二
sed -i 's/'$old_str'/'$new_str'/g' test.txt
awk命令
awk 简介
- awk是一个文本处理工具,通常用于处理数据并生成结果报告
awk的语法模式
- 第一种形式:
awk 'BEGIN {} pattern{commands}END{}
file_name - 第二种形式:
standard output | awk 'BEGIN{}pattern{commands}END{}
- 语法格式说明
BEGIN{}
正式处理数据之前执行pattern
匹配模式{commands}
处理命令,可能多行END{}
处理完所有匹配数据后执行
awk常用的内置变量
$0
整行内容awk '{print $0}
/etc/passwd
$1-$n
指定分割符后,打印当前行的第1-n个字段awk 'BEGIN{FS=":"}{print $1}
/etc/passwd 以冒号(:)为分隔符,打印/etc/passwd的第一个段
NF
number Field 当前行的字段个数,也就是多少列awk '{print NF}' /etc/passwd
NR
Number Row 当前行的行号,从1开始计数FNR
File Number Row 多文件处理时,每个文件行号单独计数,都是从0开始FS
Field Separator 输入字段分隔符。不指定默认以空格或tab键分割RS
Row Separator 输入行分隔符。默认回车换行OFS
Out Field Separator 输出段分隔符。默认为空格ORS
Out Row Separator 输出行分隔符。默认为回车换行FILENAME
处理文件的文件名ARGC
命令行参数个数ARGV
命令行参数数组
awk格式化输出printf
%s
打印字符串awk 'BEGIN{FS=":"}{printf "%s\n", $7} /etc/passwd
以字符串格式打印/etc/passwd中的第7个字段,以":"作为分隔符
%d
打印十进制数awk 'BEGIN{FS=":"} {printf "%d\n", $3} /etc/passwd
以10进制格式打印/etc/passwd中的第3个字段,以":"作为分隔符
%f
打印一个浮点数awk 'BEGIN{FS=":"} {printf "%f\n", $3} /etc/passwd
以浮点数格式打印/etc/passwd中的第3个字段,以":"作为分隔符
%x
打印一个十六进制数awk 'BEGIN{FS=":"} {printf "%#x\n", $3} /etc/passwd
以16进制格式打印/etc/passwd中的第3个字段,以":"作为分隔符
%o
打印八进制数awk 'BEGIN{FS=":"} {printf "%#o\n", $3} /etc/passwd
以8进制格式打印/etc/passwd中的第3个字段,以":"作为分隔符
%e
打印数字的科学计数法形式awk 'BEGIN{FS=":"} {printf "%e\n", $3} /etc/passwd
以科学计数法格式打印/etc/passwd中的第3个字段,以":"作为分隔符
%c
打印字符的ASCII码
awk修饰符
-
左对齐+
右对齐#
显示8进制在前面加0,显示16进制在前面加0x
awk模式匹配
- 第一种模式匹配:RegExp
- RegExp 按正则表达式匹配
awk 'BEGIN{FS=":"} /root/{print $0}' /etc/passwd
awk 'BEGIN{FS=":"} /^yarn/{print $0}' /etc/passwd
- RegExp 按正则表达式匹配
- 第二种模式匹配:关系运算匹配
- 关系运算符匹配
<
小于awk 'BEGIN{FS=":"} $3<50 {print $0}' /etc/passwd
>
大于awk 'BEGIN{FS=":"} $3>100 {print $0}' /etc/passwd
<=
小于等于awk 'BEGIN{FS=":"} $3<=50 {print $0}' /etc/passwd
>=
大于等于awk 'BEGIN{FS=":"} $3>=50 {print $0}' /etc/passwd
==
等于awk 'BEGIN{FS=":"} $3==1 {print $0}' /etc/passwd
!=
不等于awk 'BEGIN{FS=":"} $3!=1 {print $0}' /etc/passwd
~
匹配正则表达式awk 'BEGIN{FS=":"}$3~/[0-9]{3,} {print $0}' /etc/passwd
!~
不匹配正则表达式- 布尔运算符
||
或awk 'BEGIN{FS=":"} $1=="hdfs" || $1=="yarn" {print $0}' /etc/passwd
&&
与awk 'BEGIN{FS=":"} $3>50 $$ $4<100 {print $0}' /etc/passwd
!
非awk 'BEGIN{FS=":"} $3!=50 {print $0}' /etc/passwd
- 算数运算符
+
加-
减*
乘/
除%
取模^|**
乘方x++
在返回变量后,x变量加1++x
在返回变量前,x变量加1x--
在返回变量之后,x变量减1--x
在返回遍历之前,x变量减1
awk动作中的条件以及循环语句
语法格式
# 条件判断
if (condition)
{
commands
}
else if (condition)
{
commands
}
else
{
commands
}
# while循环
while(condition)
commands
# do while 循环
do
commands
while(condition)
# for 循环
for(初始化;条件判断;步长)
commands
# loop.awk
BEGIN {
while(i<=100)
{
sum += i
i++
}
print sum
}
# 调用命令
awk -f loop.awk
awk 'BEGIN{FS=":"}{if ($3>50 && $3<100) print $0}' /etc/passwd
awk字符串函数
- length(str) 计算字符串长度,返回值整数长度值
- index(str1, str2) 在str1中查找str2的位置, 返回值为位置索引,从1计数
- tolower(str) 将str转为小写,返回值为小写字符串
- toupper(str) 将str转为大写,返回值为大写字符串
- substr(str,m,n) 从str的m个字符开始,截取n位,返回值为截取后的子串
- split(str,arr, fs) 按fs切割字符串,结果保存arr中,返回切割后子串的个数
- match(str,RE) 在str中按照RE查找,返回值为索引位置
- sub(RE,RepStr,str) 替换查找到的第一个子串
- gsub(RE,RepStr,str) 替换查找到的所有子串
awk选项
- -v 参数传递
- -f 指定脚本文件
- -F 指定分隔符
- -V 查看awk的版本号