栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

find & grep & sed & awk 学习整理

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

find & grep & sed & awk 学习整理

目录

find

grep

sed

awk


find

find(查找)沿着文件目录依次向下遍历,匹配符合条件的文件,可以附带相应的选项,默认的操作结果是打印出符合条件的文件与目录

用法如下:find 路径 选项

  • -name(根据文件名查找,可使用通配符)

    #查找所有后缀为.txt的文件,
    find ./ -name "*.txt"
  • -type(根据文件类型查找)

    #查找所有普通文件
    find ./ -type f 
    
    #Linux所有文件类型:
    f:普通文件
    d:目录
    c:字符设备
    b:块设备
    p:管道文件
    s:socket文件
    l:链接文件(硬链接、软链接)
    
  • -size n[cwbkMG](根据文件大小查找)

        单位如下:

  • `b'    for 512-byte blocks (this is the default if no suffix is used)
  • `c'    for bytes
  • `w'    for two-byte words
  • `k'    for Kilobytes (units of 1024 bytes)
  • `M'    for Megabytes (units of 1048576 bytes)
  • `G'    for Gigabytes (units of 1073741824 bytes)
fzf@fzf:~/work/DailyTest/Shell/regex$ ls -l
total 8
-rw-rw-r-- 1 fzf fzf 79 Dec 25 21:14 my.html
-rw-rw-r-- 1 fzf fzf 42 Dec 25 16:47 regex
#当前目录下查找大于50字节的文件
fzf@fzf:~/work/DailyTest/Shell/regex$ find ./ -type f -size +50c
./my.html
#当前目录下查找大于30字节且小于80字节的文件
fzf@fzf:~/work/DailyTest/Shell/regex$ find ./ -type f -size +30c -size -80c
./my.html
./regex
  • (根据文件深度查找)

    -maxdepth  # 最大深度
    -mindepth  # 最小深度
    find ./ -maxdepth 1 -name "*.sh"
  • -exec 和 -ok

    把前面执行的结果传给-exec后面的命令,{}表示find命令执行结果,;表示结束

    find ./ -name "*.sh" -exec ls -lh {};
    find ./ -name "*.sh" -ok ls -lh {}; #需要用户确认再执行动作
  • -xargs 配合管道使用

    find ./ -maxdepth 1 -name "*.sh" | xargs ls -lh
  • -print0(把find命令得到的结果根据null进行分割),xargs后面的-0表示根据null来取

目录下创建"test test.sh"文件:

touch test test.sh

fzf@fzf:~/work/DailyTest/Shell/sed$ ls -lh
total 4.0K
-rw-rw-r-- 1 fzf fzf 15 Dec 27 00:12 1.txt
-rw-rw-r-- 1 fzf fzf  0 Dec 27 21:49 test test.sh

#因为xargs默认是以空格、tab来分割文件的,所以此处会报找不到./test及test.sh文件
fzf@fzf:~/work/DailyTest/Shell/sed$ find ./ -maxdepth 1 -name "*.sh" | xargs ls -l
ls: cannot access ./test: No such file or directory
ls: cannot access test.sh: No such file or directory

fzf@fzf:~/work/DailyTest/Shell/sed$ find ./ -maxdepth 1 -name "*.sh" -print0| xargs -0 ls -l
-rw-rw-r-- 1 fzf fzf 0 Dec 27 21:49 ./test test.sh
fzf@fzf:~/work/DailyTest/Shell/sed$
find ./ -maxdepth 1 -name "*.sh" -print0 | xargs -0 ls -lh
  • -atime(访问时间)单位:天

    -amin 单位:分钟

  • -mtime(文件内容修改时间)单位:天

        -mmin 单位:分钟

  • -ctime(文件属性修改时间)- 单位:天

        -cmin 单位:分钟

#当前目录下寻找文件内容修改时间是5天之前的.sh文件:
find ./ -name "*.sh" -mtime +5 -exec ls -lh {} ;
#当前目录下寻找文件内容修改时间是5天以内前的.sh文件:
find ./ -name "*.sh" -mtime -5 -exec ls -lh {} ;

grep

用于在文件中查找匹配的行,默认使用基本正则,通过-E指定使用扩展正则。

grep [OPTIONS] PATTERN [FILE...]

grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

grep -n "fang" 1.txt
 
#递归调用:
grep -R "fang" ./
​
fzf@fzf:~/work/DailyTest/Shell/regex$ cat regex
192.168.51.1
w1.182.189.18
8.8.8.8
​
abc q
#匹配Ip地址:
#使用基本正则(){}+?需要转义
grep "^([0-9]{1,3}.){3}[0-9]{1,3}$" regex
 
grep -E "^([0-9]{1,3}.){3}[0-9]{1,3}$" regex
 
egrep "^([0-9]{1,3}.){3}[0-9]{1,3}$" regex

sed
  • sed命令:sed 是一种几乎包括在所有 UNIX 平台(包括 Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。

  • 它主要是以行为主,一行一行处理。

用法如下:

sed 参数 '脚本语句' 待操作文件
sed 参数 -f 脚本文件 待操作文件
脚本语句的格式为:/pattern/action
默认使用基本正则,如要使用扩展正则,通过-r选项

常用参数:

-n:静默输出

-r:使用扩展正则

-i:直接修改文件,慎用

常用action:

追加 a

插入 i

删除 d

替换 s

打印 p

示例:

fzf@fzf:~/work/DailyTest/Shell$ cat 1.txt
fang
fzf@fzf:~/work/DailyTest/Shell$ sed '1a dddd' 1.txt
fang
dddd
fzf@fzf:~/work/DailyTest/Shell$ sed '1i dddd' 1.txt
dddd
fang
fzf@fzf:~/work/DailyTest/Shell$ sed '1d' 1.txt
fzf@fzf:~/work/DailyTest/Shell$
fzf@fzf:~/work/DailyTest/Shell$ sed 's/fang/juan/g' 1.txt
juan
fzf@fzf:~/work/DailyTest/Shell$ cat 1.txt
fang
zhan
feng
fzf@fzf:~/work/DailyTest/Shell$ sed '1,3d' 1.txt

当进行替换操作时,定界符可以为其它字符:

sed 's:test:TEXT:g'

sed 's|test|TEXT|g'

awk
  • awk是处理列的一个非常强大的工具,也是流编辑器,默认的列分隔符为空格或tab键,也可以通过参数指定

用法如下:

awk 参数 '脚本语句' fileName
awk 参数 -f 脚本文件 fileName
脚本语句的格式为/pattern/{action}

条件(pattern):
	一般使用关系表达式作为条件
    x > 10   判断变量x是否大于10
    x >=10  大于等于
    x<=10   小于等于
动作(action):
    格式化输出
    流程控制语句

常用参数:

-f:指定脚本文件

-F:指定分隔符,默认为空格或tab键

内部变量:

FS:指定分隔符

$1表示第一列, $0表示对应的行
fzf@fzf:~/work/DailyTest$ df -h | awk '{print $1 "t" $3}'
Filesystem      Used
/dev/sda3       5.2G
none    0
udev    4.0K
tmpfs   1.5M
none    0
none    0
none    0
/dev/sda1       77M
/dev/sda2       1.4G

该命令解决了用cut命令的局限性。

在awk中,可以用FS内置变量指定分割符为哪个字符,这个和cut的-d选项类似。

fzf@fzf:~/work/DailyTest$ awk 'BEGIN {FS=":"} {printf("%sn", $7)}' /etc/passwd
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync

查找pid在[1900, 2000]的进程总数:

ps aux | awk '$2>=1900 && $2<=2000 {count=count+1} END {print count}'

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/680570.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号