grep awk find

本文详细介绍了 Linux 下三个重要的文本处理命令:grep、awk 和 find 的使用方法及高级技巧。包括如何利用 grep 进行精确的文本搜索、awk 进行数据解析与处理、find 查找文件等,帮助读者掌握这些实用工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

grep

$>grep [-acinv] [–color=auto] ‘搜寻字符串’ filename 选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 ‘搜寻字符串’ 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!
–color=auto :可以将找到的关键词部分加上颜色的显示喔!

将/etc/passwd,有出现 root 的行取出来

$>grep "root" /etc/passwd 
root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin$>cat /etc/passwd | grep "root" 
root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin

将/etc/passwd,将没有出现 root 和nologin的行取出来

$>grep -v "root" /etc/passwd | grep -v "nologin"
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

根据文件内容递归查找目录

$> grep ‘energywise’ *   #在当前目录搜索带'energywise'行的文件
$> grep -r ‘energywise’ *  #在当前目录及其子目录下搜索'energywise'行的文件
$> grep -l -r ‘energywise’ *  #在当前目录及其子目录下搜索'energywise'行的文件,但是不显示匹配的行,只显示匹配的文件
  • grep与正规表达式

字符类的搜索:如果我想要搜寻 test 或 taste 这两个单字时,可以发现到,其实她们有共通的 ‘t?st’ 存在~这个时候,我可以这样来搜寻:

$>grep -n 't[ae]st' regular_express.txt
8:I can't finish the test.
9:Oh! The soup taste good.

字符类的反向选择 [^] :如果想要搜索到有 oo 的行,但不想要 oo 前面有 g,此处的^代表行首,[^]代表取反 ,如下

$>grep -n '[^g]oo' regular_express.txt
2:apple is my favorite food.
3:Football game is not use feet only.
18:google is the best tools for search keyword.
19:goooooogle yes!

行首与行尾字节 ^ $
行首字符:如果我想要让 the 只在行首列出呢? 这个时候就得要使用定位字节了!我们可以这样做:

$>grep -n '^the' regular_express.txt
12:the symbol '*' is represented as start.

那如果我想要找出来,行尾结束为小数点 (.) 的那一行:

$>grep -n '\.$' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.

找出空白行:

$>grep -n '^$' regular_express.txt
22:

awk

使用方法

awk ‘{pattern + action}’ {filenames}

调用方法

awk [-F field-separator] ‘commands’ input-file(s) 其中,commands
是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

如果只是显示最近登录的5个帐号

$>last -n 5 | awk  '{print $1}'
root
root
root
dmtsai
root

awk工作流程是这样的:读入有’\n’换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域, 0, 1表示第一个域, nn"""[tab]", 1表示登录用户,$3表示登录用户ip,以此类推。

如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割

$>cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'
root    /bin/bash
daemon  /bin/sh
bin     /bin/sh
sys     /bin/sh

这种是awk+action的示例,每行都会执行action{print $1}。
-F指定域分隔符为’:’。

如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加”blue,/bin/nosh”。

$>cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
....
blue,/bin/nosh

awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域, 0, 1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。

正则匹配
搜索/etc/passwd有root关键字的所有行

$>awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash

这种是pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。
搜索支持正则,例如找root开头的: awk -F: ‘/^root/’ /etc/passwd

搜索/etc/passwd有root关键字的所有行,并显示对应的shell

$> awk -F: '/root/{print $7}' /etc/passwd             
/bin/bash

这里指定了action{print $7}

  • awk内置变量

awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。

ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符

统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:

$>awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh
filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh
filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh

使用printf替代print,可以让代码更加简洁,易读

$> awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd

find

find常见用法示例
find path -option [ -print ] [ -exec -ok command ] {} \;
find命令的参数;

path: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ { } \;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

-print 将查找到的文件输出到标准输出
-exec command {} \; —–将查到的文件执行command操作,{} 和 \;之间有空格
-ok 和-exec相同,只不过在操作前要询用户

例:$>find . -name .svn | xargs rm -rf

-name filename #查找名为filename的文件
-perm #按执行权限来查找
-user username #按文件属主来查找
-group groupname #按组来查找
-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n #按文件访问时间来查GIN: 0px”>
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2 找文件,-n指n天以内,+n指n天以前
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2 #查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio %; #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune #忽略某个目录

find   -name april*     #在当前目录下查找以april开始的文件
find   -name   april*   fprint file        #在当前目录下查找以april开始的文件,并把结果输出到file中
find   -name ap* -o -name may*   #查找以ap或may开头的文件
find   /mnt   -name tom.txt   -ftype vfat   #在/mnt下查找名称为tom.txt且文件系统类型为vfat的文件
find   /mnt   -name t.txt ! -ftype vfat   #在/mnt下查找名称为tom.txt且文件系统类型不为vfat的文件
find   /tmp   -name wa* -type l            #在/tmp下查找名为wa开头且类型为符号链接的文件
find   /home   -mtime   -2                 #在/home下查最近两天内改动过的文件
find /home    -atime -1                  #查1天之内被存取过的文件
find /home -mmin    +60                  #在/home下查60分钟前改动过的文件
find /home   -amin   +30                  #查最近30分钟前被存取过的文件
find /home   -newer   tmp.txt             #在/home下查更新时间比tmp.txt近的文件或目录
find /home   -anewer   tmp.txt            #在/home下查存取时间比tmp.txt近的文件或目录
find   /home   -used   -2                  #列出文件或目录被改动过之后,在2日内被存取过的文件或目录
find   /home   -user cnscn                #列出/home目录内属于用户cnscn的文件或目录
find   /home   -uid   +501                  #列出/home目录内用户的识别码大于501的文件或目录
find   /home   -group   cnscn              #列出/home内组为cnscn的文件或目录
find   /home   -gid 501                  # 列出/home内组id为501的文件或目录
find   /home   -nouser                    #列出/home内不属于本地用户的文件或目录
find   /home   -nogroup                   #列出/home内不属于本地组的文件或目录
find   /home    -name tmp.txt    -maxdepth   4   #列出/home内的tmp.txt 查时深度最多为3层
find   /home   -name tmp.txt   -mindepth   3   #从第2层开始查
find   /home   -empty                     #查找大小为0的文件或空目录
find   /home   -size   +512k                #查大于512k的文件
find   /home   -size   -512k               #查小于512k的文件
find   /home   -links   +2                #查硬连接数大于2的文件或目录
find   /home   -perm   0700                #查权限为700的文件或目录
find   /tmp   -name tmp.txt   -exec cat {} \; #查找/tmp目录下 名称为tmp.txt的文件 并执行cat命令
find   /tmp   -name   tmp.txt   -ok   rm {} \;#查找/tmp目录下 名称为tmp.txt的文件 等待用户确认 是否执行rm命令
find    /   -amin    -10     # 查找在系统中最后10分钟访问的文件
find    /   -atime   -2        # 查找在系统中最后48小时访问的文件
find    /   -empty             # 查找在系统中为空的文件或者文件夹
find    /   -group   cat        # 查找在系统中属于 groupcat的文件
find    /   -mmin   -5         # 查找在系统中最后5分钟里修改过的文件
find    /   -mtime   -1       #查找在系统中最后24小时里修改过的文件
find    /   -nouser           #查找在系统中属于作废用户的文件
find    /   -user    fred     #查找在系统中属于FRED这个用户的文件

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

$>find . -type f -exec ls -l {} \; 
-rw-r–r–    1 root      root         34928 2003-02-25   ./conf/httpd.conf 
-rw-r–r–    1 root      root         12959 2003-02-25   ./conf/magic 
-rw-r–r–    1 root      root          180 2003-02-25   ./conf.d/README 

在/ l o g s目录中查找更改时间在5日以前的文件并删除它们:

$> find logs -type f -mtime +5 -exec   -ok   rm {} \;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值