美文网首页
shell四板斧总结(find,grep,sed,awk)

shell四板斧总结(find,grep,sed,awk)

作者: hemingkung | 来源:发表于2019-06-27 18:38 被阅读0次

/************************************************************************************************************/
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文件的行数 分两种方式进行显示行数 

















/************************************************************************************************************/





相关文章

网友评论

      本文标题:shell四板斧总结(find,grep,sed,awk)

      本文链接:https://www.haomeiwen.com/subject/ozcdcctx.html