/************************************************************************************************************/
find命令总结
常用选项:
-name 查找/etc目录下以conf结尾的文件 find /etc -name '*conf'
-iname 查找当前目录下文件名为aa的文件,不区分大小写 find . -iname aa
-user 查找文件属主为hdfs的所有文件,不区分大小写 find . -user hdfs
-group 查找文件属组为yarn的所有文件 find . -group yarn
f 文件 find . -type f
d 目录 find . -type d
c 字符设备文件 find . -type c
b 块设备文件 find . -type b
l 链接文件 find . -type l
p 管道文件 find . -type p
-size
-n 大小小于n的文件
+n 大小大于n的文件
例子1:查找/etc目录下小于1000字节的文件
find /etc -size -10000c
例子2:查找/etc目录下大于1M的文件
find /etc -size +1M
-mtime
-n n天以内修改的文件
+n n天以外修改的文件
n 正好n天修改的文件
例子1:查找/etc目录下五天之内修改且以conf结尾的文件
find /etc -mtime -5 -name '*.conf'
例子2:查找/etc目录下10天之前修改且属主为root的文件
find /etc -mtime +10 -user root
-mmin
-n n分钟以内修改的文件
+n n分钟以外修改的文件
例子1:查找/etc目录下30分钟之前修改的文件 find /etc -mmin +30
例子2:查找/etc目录下30分钟之内修改的文件 find /etc -mmin -30 -type d
-maxdepth n
表示最多搜索到n级子目录
例子1:在/etc下搜索符合条件的文件,但最多搜索到2级子目录
find /etc -maxdepth 3 -name '*.conf'
例子2:
find ./etc/ -type f -name '*.conf' -size +10k -maxdepth 2
了解选项:
-nouser 查找没有属主的用户
例子: find . -type f -nouser
-nogroup 查找没有属组的用户
例子: find . -type f -nogroup
-perm
例子: find . -perm 664
-prune
通常和-path一起使用,用于将特定目录排除在搜索条件之外
例子1:查找当前目录下的所有普通文件,但排除test目录
find . -path ./etc -prune -o -type f
例子2:查找当前目录下所有的普通文件,但排除etc和opt目录
find . -path ./etc -prune -o -path ./opt -prune -o -type f
例子3:查找当前目录下所有普通文件,但排除etc和opt目录,且属主为hdfs
find . -path ./etc -prune -o -path ./opt -prune -o -type f -a -user hdfs
例子4:查找当前目录下所有普通文件,但排除etc和opt目录,但属主为hdfs,且文件的大小必须大于500字节
find . -path ./etc -prune -o -path ./opt -prune -o -type f -a -user hdfs -a -size +500c
-newer file1
例子: find /etc -newer a
操作:
-prin 打印输出
-exec 对搜索到的文件执行特定的操作,格式为-exec 'command' {} \;
例子1:搜索/etc下的文件(非目录),文件名以conf结尾,且大于10k,然后将其删除
find ./etc/ -type f -name '*.conf' -size +10k -exec rm -f {} \;
例子2:将/var/log目录下以log结尾的文件,且更改时间在7天以上的删除
find /var/log/ -name '*.log' -mtime +7 -exec rm -rf {} \;
例子3:搜索条件和例子1一样,只是不删除,而是将其复制到/root/conf目录下
find ./etc/ -size +10k -type f -name '*.conf' -exec cp {} /root/conf/ \;
-ok 和exec功能一样,只是每次操作都会给用户提示
逻辑运算
-a 与
-o 或
-not|! 非
例子1:查找当前目录下,属主不是hdfs的所有文件
find . -not -user hdfs | find . ! -user hdfs
例子2:查找当前目录下,属主属于hdfs,且大小大于300字节的文件
find . -type f -a -user hdfs -a -size +300c
例子3:查找当前目录下的属主为hdfs或者以xml结尾的普通文件
find . type f -a \( -user hdfs -o -name '*.xml'\)
/************************************************************************************************************/
/************************************************************************************************************/
grep和egrep
grep的语法格式:
grep [option] [pattern] [file1,file2...]
必须掌握的选项:
-v 显示不匹配pattern的行 grep -v python file
-i 搜索时忽略大小写 grep -i python file
-n 显示行号 grep -n python file
-E 支持扩展的正则表达式 grep -E "python|PYTHON" file
-F 不支持正则表达式,按字符串的字面意思进行匹配 grep -F "py.*" file
-r 递归搜索,当前目录下递归搜索所有 grep -r love
需要了解的选项
-c 只输出匹配行的数量,不显示具体内容 grep -c man /etc/man_db.conf
-w 匹配整词 grep -w love file
-x 匹配整行 grep -x "i love java" file
-l 只列出匹配的文件名,不显示具体匹配行的内容
grep和egrep
grep默认不支持扩展正则表达式,只支持基础正则表达式
使用grep -E 可以支持扩展的正则表达式
使用egrep可以支持扩展正则表达式,与grep -E等价
例子:
grgrep "PY" file
grep "py.*" file
grep -E "python|PYTHON" file
egrep "python|PYTHON" file
/************************************************************************************************************/
/************************************************************************************************************/
sed是流编辑器,依据特定的匹配模式,对文章逐行进行匹配,并对匹配行进行特定的处理
命令格式:sed [option] "/pattern/command" file
pattern用法:
1、LineNumber --------------------直接指定行号
sed -n "17p" file 打印file文件的第17行
2、StartLine,EndLine --------------------指定起始行号和结束行号
sed -n "10, 20p" file 打印file文件的10到20行
3、StartLine,+N --------------------指定起始行号和结束行号
sed -n "10, +5p" file 打印file文件从第10行开始,往后面加5行
4、/pattern1/ --------------------正则表达式匹配的行
sed -n "/^root/p" file 打印file文件中以root开头的行
5、/pattern1/,/pattern2/ --------------------从匹配pattern1的行,到匹配pattern2的行
sed -n "/^ftp/,/^mail/p" file 打印file文件中第一个以ftp开头的行,到第二个以mail开头的行
6、LineNumer,/pattern1/ --------------------从指定的行号开始匹配,知道匹配到pattern1的行
sed -n "4, /^hdfs/p" file
7、/pattern1/LineNumber --------------------从pattern1匹配的行开始,直到匹配到指定的行号的行
sed -n "/root/,10p" file 打印file文件中匹配root的行,直到第10行结束
sed的编辑命令
对文件的操作,无非就是增加、删除、查询、修改
编辑命令用法总结
查询:
1、p -------------------------打印
删除:
2、d -------------------------删除
sed -i '/\/sbin\/nologin/d' passwd
增加
3、a --------------------------匹配到的行后面增加内容
sed -i '/\/bin\/bash/a This is user which can login to system' file
4、i --------------------------匹配到的行前增加内容
sed -i '/^hdfs/,/^yarn/i AAAAAAAAAAAAAAAAAA' passwd
5、r --------------------------将后面指定文件的内容追加的匹配的行后面
sed -i '/root/r list' passwd
6、w --------------------------将匹配的行内容另存到其他文件
sed -n '/\bin\/bash/w /tmp/user_login.txt' passwd
修改
7、s/pattern/string/ ----------------查找并替换,查找符合pattern模式的字符串
sed -i 's/\/bin\/bash/\/BIN\/BASH/' passwd
s/pattern/string/g ----------------g表示全部行内全部匹配
sed -i 's/\/bin\/bash/\/BIN\/BASH/g' passwd
s/pattern/string/2g ----------------2g表示,同一行内,只替换从第二个开始到剩下所有的符合条件的
s/pattern/string/ig ----------------加i参数表示匹配时忽略大小写,g表示全部行内的匹配
sed -i 's/hadoop/HADOOP/ig' str.txt
其他编辑命令:
8、= ----------------显示行号
sed -n '/\/sbin\/nologin/=' passwd
什么是反向引用?
&和\1 ------------引用模式匹配到的整个串
sed "s/1..e/&r/g" file ------------在file中寻找以1开头,然后跟两个任意字符,以e结尾的字符串
sed "s/\(1..e\)/1r/g" file ------------和上面实现一样的功能,使用\1代表搜寻到的字符串
上面两种方式实现了一样的功能,分别使用&和\1引用前面匹配到的整个字符串
两者的区别在于&只能表示匹配到的完整的字符串,只能引入整个字符串
而\1可以使用()对匹配到的字符串进行替换
例如:
如果我们仅想要替换匹配到字符串的一部分,name必须使用\1这种方式,不能使用&
例子1:查找test.txt文件中以1开头,紧接着跟两个任意的字符,再接一个e的字符串,将找到的字符串的开头加L
sed "s/l\(..e\)/L\1/g"
sed中引用变量时的注意事项:
1、匹配模式中存在的变量,则建议使用双引号
2、sed中需要引入自定义的变量时,如果外面使用单引号,则自定义变量也必须使用单引号
利用sed查找文件的内容
pattern的种类
1、8p
2、8p,10p
3、8,+5p
4、/regexp/p
5、/regexp_1/,/regexp_2/p
6、8,/regexp/p
7、/regexp/,8p
1、打印/etc/passwd中第20行的内容
sed -n '20p' /etc/psswd
2、打印出/etc/passwd中从第八行开始,到第15行结束的内容
sed -n '8,15p' /etc/passwd
3、打印/etc/passwd中第8行开始,然后+5行结束的内容
sed -n '8,+5p' /etc/passwd
4、打印/etc/passwd中开头匹配hdfs字符串的内容
sed -n '/^hdfs/p' /etc/passwd
5、打印/etc/passwd中开头为root的行开始,到开头为hdfs的行结束的内容
sed -n '/^root/, /^hdfs/p' /etc/passwd
6、打印/etc/passwd中第8行开始,到含有/sbin/nologin的内容的行结束的内容
sed -n '8,/\/bin\/bash/, 5p' /etc/passwd
7、打印/etc/passwd中第一个包含/bin/bash内容的行开始,到第五行结束的内容
sed -n '/\/bin\/bash/, 5p' /etc/passwd
利用sed删除文件的内容
总结:
用法总结:
1、1d
2、5,10d
3、10,+10d
4、/pattern1/d
5、/pattern1/, /pattern2/d
6、/pattern1/, 20p
7、15,/pattern1/d
练习例子:
1、删除/etc/passwd中的第15行
sed -i '15d' /etc/passwd
2、删除/etc/passwd中的第8行到第14行的所有内容
sed -i '8, 14d' /etc/passwd
3、删除/etc/passwd中的不能登录的用户(筛选条件:/sbin/nologin)
sed -i '/\/sbin\/nologin/, 13d' passwd
4、删除/etc/passwd中以mail开头的行,到以yarn开头的行的所有内容
sed -i '/^mail/,/^yarn/d' passwd
5、删除/etc/passwd中第一个不能登录的用户,到第13行的所有内容
sed -i '/\/sbin\/nologin/, 13d' /etc/passwd
6、删除/etc/passwd中以yarn开头的行到最后行的所有内容
sed -i '5, /^ftp/d' /etc/passwd
7、删除/etc/passwd中以yarn开头的行到最后行的所有内容
sed -i '/^yarn/, &' /etc/passwd
典型需求
1、删除配置文件中的所有注释行和空行
sed -i '/[:blank:]*#/d; /^$/d' ngnix.conf
2、在配置文件中所有不以#开头的行前面添加*符号,注意:以#开头的不能添加
sed -i 's/^[^#]/\*&/g' ngnix.conf
sed 修改文件内容
总结
修改用法总结
1、1s/old/new
2、5,10s/old/new
3、10,10s/old/new
4、/pattern1/s/old/new/
5、/pattern1/,/pattern2/s/old/new/
6、/pattern1/,20s/old/new/
7、15,/pattern1/s/old/new/
练习例子:
1、修改/etc/passwd中第1行中的第1个root为ROOT
sed -i 'ls/root/ROOT' /etc/passwd
2、修改/etc/passwd中第5行到第10行中所有的/sbin/nologin为/bin/bash
sed -i '/\/sbin\/nologin/s/login/LOGIN/g' /etc/passwd
3、修改/etc/passwd中匹配到的/sbin/nologin的行,将匹配到的行中的login改为大写的LOGIN
sed -i '/\/sbin\/nologin/s/login/LOGIN/g' /etc/passwd
4、修改/etc/passwd中从匹配到的以root开头的行,到匹配到的行中包含mail的所有的行中的bin修改为HADOOP
sed -i '/^root/,/mail/s/bin/HADOOP/g' /etc/passwd
5、修改/etc/passwd中从匹配到以root开头的行,到第15行中所有行,修改这些内容中含有nologin的内容为SPARK
sed -i '/^root/,15s/nologin/SPARK/g' /etc/passwd
6、修改/etc/passwd中从第15行开始,到匹配到以yarn开头的所有行,将这些内容中含有的bin替换成BIN
sed -i '15, /^yarn/s/bin/BIN/g' /etc/passwd
利用sed追加内容
1、a append
(1)、passwd文件第10行后面追加"Add Line Behind"
sed -i '10a Add Line Begind' passwd
(2)、passwd文件第10行到20行,每一行后面追加"Test Line Behind"
sed -i '10,20a Test Line Behind' passwd
(3)、passwd文件匹配到/bin/bash的行后面追加"Insert Line For /bin/bash Behind"
sed -i '/\/bin\/bash/a Insert Line For /bin/bash Behind' passwd
2、i
(1)、passwd文件匹配到以yarn开头的行,在匹配行前面追加"Add Line Before"
sed -i '/^yarn/i Add Line Before' passwd
(2)、passwd文件的每一行前面都追加"Insert Line Before Every Line"
sed -i 'i Insert Line Before Every Line' passwd
3、r
(1)将/etc/fstab文件的内容追加到passwd文件的第20行后面
sed -i '20r /etc/fstab' passwd
(2)将/etc/inittab文件的内容追加passwd文件匹配/sbin/nologin行的后面
sed -i '/\bin\/bash/r /etc/inittab' passwd
(3)将/etc/vconsole.conf文件内容追加到passwd文件中特定行的后面,匹配以ftp开头的行
sed -i '//, 18r /etc/vconsole.conf' passwd
/****************************************************************************************/
awk
awk的内置变量
awk 'BEGIN{}pattern{command}END{}'
总结:内置变量
$0 打印出行所有信息
awk '{print $0}' /etc/passwd
$1-$n 打印行的第1到n个字段的信息
awk 'BEGIN{FS=":"}{print $1}' /etc/passwd
NF (Number Field) 处理行的字段个数
awk '{print NF}' list
NR (Number Row) 处理行的行号
awk '{print NR}' list /etc/passwd 后面指定的文件行数累加
FNR (File Number Row) 多文件处理时,每个文件单独记录行号
awk 'print FNR' list /etc/passwd
FS (Filed Separator) 字段分割符,不指定时默认以空格或tab键做分割
awk 'BEGIN{FS="|"}{print $2}' list
RS 行分割符,不指定时以回车换行分割
awk 'BEGIN{FS="|";RS="---"}{print $2}' list
OFS (Output Filed Separator) 输出字段分割符
awk 'BEGIN{RS="--";FS="|";ORS="&";OFS=":"}{print $1,$3}' list
ORS (Output Row Separator) 输出行分隔符
awk 'BEGIN{RS="--";FS="|";ORS="&"}{print $3}' list
FILENAME 处理文件的文件名
awk '{print FILENAME}' list
ARGC 命令行参数的个数
awk '{print ARGC}' list
ARGV 命令行参数数组
awk格式化输出之printf总结
%s 打印字符串
%d 打印10进制数
%f 打印浮点数
%x 打印16进制数
%o 打印8进制数
%e 打印数字的科学计数法格式
%c 打印单个字符的ASCII码
修饰符
- 左对齐
+ 右对齐
# 显示8进制在前面加0 显示16进制在前面加0x
格式示例:
1、以字符串格式打印/etc/passwd中的第七个字段
awk 'BEGIN{FS=":"}{printf "%s",$7}' /etc/passwd
2、以10进制格式打印/etc/passwd中的第三个字段,以":"作为分隔符
awk 'BEGIN{FS=":"} {printf "%d\n",$3}' /etc/passwd
3、以浮点数格式打印/etc/passwd中的第三个字段,以":"作为分隔符
awk 'BEGIN{FS=":"} {printf "%f\n",$3}' /etc/passwd
4、以16进制数格式打印/etc/passwd中的第三个字段,以":"作为分隔符
awk 'BEGIN{FS=":"} {printf "%x\n",$3}' /etc/passwd
5、以8进制格式打印/etc/passwd中的第三个字段,以":"作为分隔符
awk 'BEGIN{FS=":"} {printf "%o\n",$3}' /etc/passwd
6、以科学计数法格式打印/etc/passwd中的第三个字段,以":"作为分隔符
awk 'BEGIN{FS=":"} {printf "%e\n",$3}' /etc/passwd
修饰符示例:
1左对齐格式
2右对齐格式
3打印8进制或者16进制是在前面加#
/********************************************************************************/
awk模式匹配用法总结:
①、RegExp
②、运算符匹配
1、RegExp
匹配/etc/passwd文件中含有root字符串的所有行
awk 'BRGIN{FS=":"}/root/{print $0}' /etc/passwd
匹配/etc/passwd文件行中以yarn开头的所有行
awk 'BRGIN{FS=":"}/^yarn/{print $0}' /etc/passwd
2、运算符匹配
关系运算符匹配
< 小于
> 大于
<= 小于等于
>= 大于等于
== 等于
!= 不等于
~ 匹配正则表达式
1、以:为分隔符,匹配/etc/passwd文件中第3个字段小于50的所有行信息
awk 'BEGIN{FS=":"}$3<50{print $0}' /etc/passwd
2、以:为分隔符,匹配/etc/passwd文件中第3个字段大于50的所有行信息
awk 'BEGIN{FS=":"}$3>50{print $0}' /etc/passwd
3、以:为分隔符,匹配/etc/passwd文件中第7个字段为/bin/bash的所有行信息
awk 'BEGIN{FS=":"}$7=="/bin/bash"{print $0}' /etc/passwd
4、以:为分隔符,匹配/etc/passwd文件中第7个字段不为/bin/bash的所有行信息
awk 'BEGIN{FS=":"}$7!="/bin/bash" /etc/passwd
5、以:为分隔符,匹配/etc/passwd文件中第3个字段包含3个以上数字的所有行信息
awk 'BEGIN{FS=":"}$3~/[0-9]{3,}/{print $0}' /etc/passwd
布尔运算符匹配
|| 或
&& 与
! 非
1:以:分隔符,匹配/etc/passwd文件中包含hdfs或者yarn的所有行信息
awk 'BEGIN{FS=":"}$1=="hdfs"||$1=="yarn"{print $0}' /etc/passwd
2:以:分隔符,匹配/etc/passwd文件中第三个字段小于50并且第四个字段大于50的所有行信息
awk 'BEGIN{FS=":"}$3<50 && $4>50{print $0}' /etc/passwd
awk的基本运算
+ 加
- 减
* 乘
/ 除
% 取模
^或** 乘方
++x 在返回x变量之前,x变量加1
x++ 在返回x变量之后,x变量加1
--x 在返回x变量之前,x变量减1
x-- 在返回x变量之后,x变量减1
1 使用awk计算/etc/services中空白的行数量
2 计算学生课程分数的平均值 学生课程文件如下
3 使用awk输出/etc/passwd文件的行数 分两种方式进行显示行数
/************************************************************************************************************/
网友评论