grep和egrep
- 第一种形式:
grep [option] [pattern] [file1 file2 ...]
- 第二种形式:
command | grep [option] [patern]
- 选项:option
-v
不显示匹配行
-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详解
查询
增加
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替换为new
sed -i 's/root/ROOT' file
匹配file文件中,替换第一个以root的行为ROOT
s/old/new/g
将行内全部的old替换为new
sed -i 's/\/bin\/bash/\/BIN\/BASH/g' file
匹配file文件中,将所有/bin/bash替换成/BIN/BASH的行
s/old/new/2g
将行内从第2个开始,到剩下所有的old替换为new
sed -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结尾的字符,并在匹配的字符串后面加个s
sed -i 's/\(had..p\)/\1s/g' file
匹配file文件中,匹配had开始,已p结尾的字符,并在匹配的字符串后面加个s
sed -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
- 第二种模式匹配:关系运算匹配
- 关系运算符匹配
<
小于
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变量加1
x--
在返回变量之后,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的版本号