300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Linux之四剑客:find sed grep awk

Linux之四剑客:find sed grep awk

时间:2023-08-18 12:06:20

相关推荐

Linux之四剑客:find sed grep awk

目录

find查找方式1、按名字查找2、按目录查找3、按权限查找4、按类型查找 (b/d/c/p/l/f )5、按属主及属组6、按时间查找7、按文件新旧8、按大小查找 sed1.打印显示文本内容2.增加文件内容,向文件中添加或插入行 grep格式:参数:范例: awk简介:格式:参数:运算符:内建变量:案例:

find

大海捞针,主要是用于查找Linux 操作系统的某个文件、目录所在路径,查找出满足条件的文件或者目录的路径 【和locate命令很相似】

格式:

find path -option 【 -print 】 【 -exec -ok |xargs |grep 】 【 command {} ; 】

path:要查找的目录路径。 ~ 表示$HOME目录. 表示当前目录/ 表示根目录options:表示查找方式

options常用的有下选项:

-name filename #查找名为filename的文件

-perm #按执行权限来查找

-user username #按文件属主来查找

-group groupname #按组来查找

-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前

-atime -n +n #按文件访问时间来查找文件,-n指n天以内,+n指n天以前

-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前

-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在

-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存

-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件

-size n[c] #查长度为n块[或n字节]的文件

-mount #查文件时不跨越文件系统mount点

-follow #如果遇到符号链接文件,就跟踪链接所指的文件

-prune #忽略某个目录

print:表示将结果输出到标准输出。

exec:对匹配的文件执行该参数所给出的shell命令。

形式为command {} \;,注意{}\;之间有空格

ok:与exec作用相同,

区别在于,在执行命令之前,都会给出提示,让用户确认是否执行

|xargsexec作用相同 ,起承接作用

区别在于|xargs主要用于承接删除操作 ,而-exec都可用 如复制、移动、重命名等

查找方式

1、按名字查找

在当前目录及子目录中,查找大写字母开头的txt文件

$ find . -name ‘[A-Z]*.txt’ -print

在/etc及其子目录中,查找host开头的文件

$ find /etc -name ‘host*’ -print

在$HOME目录及其子目录中,查找所有文件

$ find ~ -name ‘*’ -print

在当前目录及子目录中,查找不是out开头的txt文件

$ find . -name “out*” -prune -o -name “*.txt” -print

2、按目录查找

在当前目录除aa之外的子目录内搜索 txt文件

$ find . -path “./aa” -prune -o -name “*.txt” -print

在当前目录及除aa和bb之外的子目录中查找txt文件

$ find . −path ′./aa′ −o −path ′./bb′ -a -prune -o -name ‘*.txt’ -print

3、按权限查找

在当前目录及子目录中,查找属主具有读写执行,其他具有读执行权限的文件

$ find . -perm 755 -print

查找用户有写权限或者组用户有写权限的文件或目录

find ./ -perm /220

find ./ -perm /u+w,g+w

find ./ -perm /u=w,g=w

4、按类型查找 (b/d/c/p/l/f )

在当前目录及子目录下,查找符号链接文件

$ find . -type l -print

5、按属主及属组

查找属主是www的文件

$ find / -user www -type f -print

查找属主被删除的文件

$ find / -nouser -type f -print

查找属组 mysql 的文件

$ find / -group mysql -type f -print

查找用户组被删掉的文件

$ find / -nogroup -type f -print

6、按时间查找

查找2天内被更改过的文件

$ find . -mtime -2 -type f -print

查找2天前被更改过的文件

$ find . -mtime +2 -type f -print

查找一天内被访问的文件

$ find . -atime -1 -type f -print

查找一天前被访问的文件

$ find . -atime +1 -type f -print

查找一天内状态被改变的文件

$ find . -ctime -1 -type f -print

查找一天前状态被改变的文件

$ find . -ctime +1 -type f -print

查找10分钟以前状态被改变的文件

$ find . -cmin +10 -type f -print

7、按文件新旧

查找比 aa.txt 新的文件

$ find . -newer “aa.txt” -type f -print

查找比 aa.txt 旧的文件

$ find . ! -newer “aa.txt” -type f -print

查找比aa.txt新,比bb.txt旧的文件

$ find . -newer ‘aa.txt’ ! -newer ‘bb.txt’ -type f -print

8、按大小查找

查找超过1M的文件

$ find / -size +1M -type f -print

查找等于6字节的文件

$ find . -size 6c -print

查找小于32k的文件

$ find . -size -32k -print

9、执行命令

1)查找 del.txt 并删除,删除前提示确认

$ find . -name ‘del.txt’ -ok rm {} ;

2) 查找 aa.txt 并备份为aa.txt.bak

$ find . -name ‘aa.txt’ -exec cp {} {}.bak ;

3)查当前目录下的所有普通文件

$ find . -type f -exec ls -l {} ;

查当前目录下的所有普通文件,并在 - exec 选项中使用 ls -l 命令将它们列出

4)在 /logs 目录中查找更改时间在5日以前的文件并删除它们

$ find logs -type f -mtime +5 -exec -ok rm {} ;

5)查询当天修改过的文件

$ find ./ -mtime -1 -type f -exec ls -l {} ;

6)查询文件并询问是否要显示

$ find ./ -mtime -1 -type f -ok ls -l {} ;

例题:

基于FIND查找Linux操作系统指定目录以.log名称,排除access.log 和error.log,查找10天以前的,查找文件类型而不是目录类型, 日志大小大于20M,小于35M,该日志文件拥有者是root用户, 然后将软件备份到/tmp/;

find / -name "*.log" ! -name "access.log" ! -name "error.log" -mtime -10 -type f -size +20M -size -35M -user root -exec cp {} /tmp/ \;

sed

sed 是一种在线的、非交互式的编辑器,在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳过。

格式:

sed [options] pattern filename

说明:

参数说明:

-e 多点编辑

-f 从指定文件中读取编辑

-i.bak 备份,并对内容进行修改

-n 取消自动打印

-r 支持使用扩展正则表达式

-V 显示版本信息

-h 显示帮助

=============

动作说明:

动作前面通常加一些匹配项

a 新增, a 后面可以接字串,而这些字串会在新的一行出现(目前的下一行)

c 取代, c 后面可以接字串,这些字串可以取代 n1,n2 之间的行

d 删除, d 通常后面不接任何咚咚

i 插入, i 后面可以接字串,而这些字串会在新的一行出现(目前的上一行)

p 打印, p 通常会与参数 sed -n 一起运行

s 取代, s 通常可以搭配正规表示法,例如 1,20s/old/new/g

= 显示匹配的行号

! 取反

1.打印显示文本内容

sed -n '3p' test.sh # 打印文件的第3行sed -n '$p' test.sh # 打印文件的最后一行sed -n '3,6p' test.sh # 打印文件的第3行到第6行sed -n '3,$p' test.sh # 打印文件的第3行到最后一行的内容sed -n '3~2p' test.sh # 从第3行开始,每隔两行打印一行,波浪号后面的2表示步长sed -n '/love/p' test.sh # 打印匹配love的行sed -n '/love/,3p' test.sh# 打印从匹配love的行到第3行的内容,及后面所有匹配love的行sed -n '/love/,$p' test.sh# 打印从匹配love的行到最后一行的内容sed -n '/love/,+1p' test.sh# 打印匹配love的行及其向后一行,如果有多行匹配love,则匹配的每一行都会向后多打印一行sed -n '/love/,/you/p' test.sh # 打印从匹配内容love到匹配内容you的行sed -n '3,/love/p' test.sh# 打印第三行到匹配love的行sed -n "$=" test.sh # 打印test.sh文件最后一行的行号sed -n '/error/=' test.sh # 打印匹配error的行的行号sed -n '/error/{=;p}' test.sh # 打印匹配error的行的行号和内容(可用于查看日志中有error的行及其内容)

2.增加文件内容,向文件中添加或插入行

sed '3apython' test.sh # 在第三行后面添加python,3表示行号sed '3ipython' test.sh # 在第三行之前插入python,3表示行号sed '$apython' test.sh # 在最后一行之后添加pythonsed '$ipython' test.sh # 在最后一行之前插入pythonsed '/123/apython' test.sh # 在包含123的行后面添加python,如果文件中有多行包括123,则每一行后面都会添加sed '/123/ipython' test.sh # 在包含123的行之前插入python,如果文件中有多行包含123,则每一行之前都会插入

3.删除文件中指定的行

sed '3d' 1.txt # 删除第三行sed '$d' 1.txt # 删除最后一行sed '1~2d' 1.txt# 从第一行开始删除,每隔2行就删掉一行,即删除奇数行sed '1,3d' 1.txt# 删除1~3行sed '1,3!d' 1.txt # 删除1~3之外的所有行sed '/123/d' 1.txt # 删除匹配123的行sed '/123/,$d' 1.txt# 删除从匹配123的行到最后一行sed '/123/,+1d' 1.txt# 删除匹配123的行及其后面一行sed '/^$/d' 1.txt # 删除空行sed '/123\|abc/!d' 1.txt # 删除不匹配123或abc的行,/123\|abc/ 表示匹配123或abc ,!表示取反

4.更改文件中指定的行

sed '1chello' test.sh # 将文件的第一行替换为hello sed '$chello' test.sh # 将文件的最后一行替换为hellosed '/123/chello' test.sh# 将包含123的行替换为hello

grep

grep 是一个基于正则表达式的全局文本搜索工具,根据用户指定的“模式(pattern)”对目标文本进行过滤,显示匹配到的行。

格式:

grep [options] pattern filename

参数:

-a 不忽略二进制数据

-i 不区分大小写,忽略字符大小写

-v 取反,显示不被pattern匹配到的行

-V 显示版本信息

-n 显示匹配结果的行号

-c 统计匹配结果的行数

-o 仅显示匹配到的字符串,不把整行显示出来

-e 实现多个选项的匹配,逻辑or关系

-q 静默模式,不输出任何信息。与"echo $"合用,查看是否匹配到,0表示匹配到,1表示没有匹配到

-Ax: 显示匹配结果所在行以及该行之后的指定行数,x是行数,A:after。

-Bx: 显示匹配结果所在行以及该行之前的指定行数,x是行数,B:before。

-Cx: 显示匹配结果所在行以及该行之前和该行之后的指定行数,x是行数,C:context

–color 显示颜色

-E 使用扩展正则表达式,相当于egrep

-w 匹配整个单词,如果是字符串中包含这个单词,则不作匹配

-l 列出匹配字符串的文件名

-L 列出不匹配字符串的文件名

范例:

grep "root" /etc/passwd# 找到root所在的所有行并显示grep -v "root" /etc/passwd # 找到除root外的所有行并显示grep -n "root" /etc/passwd # 显示行号grep -c "root" /etc/passwd # 显示匹配结果的行数grep -A2 "root" /etc/passwd # 匹配含有root的行,以及该行的后两行grep -e "root" -e "myuser" /etc/passwd

awk

简介:

awk是一个报告生成器,拥有强大的文本格式化能力;

也是一种文本处理工具,但其主要功能是从处理文件中按照输入的信息格式后显示的工具

awk是一种编程语言,支持条件判断、数组、循环等功能。用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

格式:

awk [options] ‘pattern { action} pattern {action}…’ file

参数:

-F 指定字段分隔符

-v 定义或个性一个 awk 内部的变量

-f 指定脚本文件

运算符:

= += -= *= /= %= ^= **= 赋值

?: C 条件表达式

&& || ! 逻辑与/或/非

~ ~! 匹配正则 不匹配正则

< <= > >= != == 关系运算符

空格 连接

% / + - *

^ *** 求幂

++ –

$ 字段引用

内建变量:

$0 表示整个当前行

$1 第 1 列

NF 当前行的字段的个数(列数)

NR 当前处理的文本行的行号,多文件记录递增

FNR 各文件分别计数的行号,多文件记录不递增

FS 输入字段分隔符(默认为空白字符)

OFS 输出字段分隔符(默认为空白字符)

RS 输入记录分隔符(输入换行符)

ORS 输出记录分隔符(输出换行符)

ARGC 命令行参数的个数

ARGV 数组,保存的是命令行所给定的各参数

案例:

awk -F "GET|HTTP" 'print $2' access.logawk '$6~/Failed/{print $11}' /var/log/secureawk 'NR==20,NR==30' filenameawk '{sum+=$0}END{print sum}' ett.txtawk '{array[$1]++}END{for(key in array)print key,array[key]}' access.logawk '{print}' /etc/passwdawk '{print $0}' /etc/passwdawk '{print $1,$4}' log.txt # 输出第 1 及 第 4 列(默认以空格或 Tab 来分隔列)awk '{printf "%-8s %-10s\n",$1,$4}' log.txt # 格式化输出awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwdawk -F, '{print $1,$2}' log.txtawk 'BEGIN{FS=","} {print $1,$2}' log.txtawk -F '[ ,]' '{print $1,$2,$5}' log.txt #使用空格及 , 作为分割符awk -va=1 '{print $1,$1+a}' log.txt # 设置变量并调用awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txtawk '$1>2' log.txt # 过滤第一列大于 2 的行awk '$1==2 {print $1,$3}' log.txt awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txtawk 'NR==5' test.txtawk 'NR==2,NR==6' test.txtawk '{print NR,$0}' test.txt # 类似 cat -n test.txtawk 'NR==2,NR==6 {print NR,$0}' test.txtawk -F ":" '{print $1,$3,$NF}' test.txtawk '{gsub("/sbin/nologin", "/bin/bash", $0);print $0}' test.txt #将 /sbin/nologin 替换为 /bin/bashifconfig eth0|awk -F "(addr:)|( Bcase:)" 'NR==2{print $2}' # 取 IP地址ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}'awk -F '/' '{print $3}' books1.txt|sort|uniq -cawk -F '/' '{hotel[$3]++;print $3,hotel[$3]}' books1.txtawk -F '/' '{array[$3]++}END{print "", array[""]print "", array[""]print "", array[""]}' books1.txtawk -F '/' '{hotel[$3]++}END{for(domain in hotel)print domain,hotel[domain]}' books1.txtawk '$2 ~ /th/ {print $2,$4}' log.txt # 输出包含 "th" 的第二列,并打印第二列与第四列awk '/re/ ' log.txt # 输出包含 re 的行awk 'BEGIN{IGNORECASE=1} /this/' log.txt # 忽略大小写awk '!/th/ {print $2,$4}' log.txt # 在包含 th 的行中输出第 2,4 列awk 'BEGIN{X=0} /^$/{ X+=1 } END{print "I find",X,"blank lines."}' test.txt # 统计空行数 ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is",sum}' # 计算文件大小route -n|awk 'NR!=1{print}' # 不显示第一行awk '!/mysql|mail/{print}' /etc/passwdawk -F: '/mail/,/mysql/{print}' /etc/passwd # 区间匹配awk -F: '$1~/mail/{print $1}' /etc/passwd # $1 匹配指定内容才显示awk -F: '{if($1~/mail/) print $1}' /etc/passwd # 与上面相同,if 必须用在 {} 中,且比较内容用 () 括起来

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。