Linux系统常用指令(六)grep、sed 和 awk


1 概论

命令特点场景
grep过滤grep命令过滤速度是最快的
sed替换,修改文件内容,取行进行替换/修改文件内容 取出某个范围的内容
awk取列,统计计算取列 对比,比较 >= <= != 统计,计算(awk数组)

2 grep 指令

选项含义
-E==egrep 支持正则扩展
-Aafter -A3 匹配你要的内容并且显示接下来的3行
-Bbefore -B3 匹配你要的内容并且显示上面的3行
-Ccontext -C3 匹配你要的内容并且显示上下3行
-c统计出现了多少行,类似于wc -l
-v取反 排除(行)
-n显示行号
-i忽略大小写
-w精确匹配
[Tom@hadoop102 hadoop-3.1.3]$ cat cut.txt 
guan yu
liu bei
zhang fei
syn quan
zhuge liang
sima yi
ma chao
huang zhong
xu chu
yuan shao
lv bu
chen gong
wei yan
ma teng
jiang wei
[Tom@hadoop102 hadoop-3.1.3]$ cat cut.txt | grep -A3 'sima yi'
sima yi
ma chao
huang zhong
xu chu
[Tom@hadoop102 hadoop-3.1.3]$ cat cut.txt | grep -B3 'sima yi'
zhang fei
syn quan
zhuge liang
sima yi
[Tom@hadoop102 hadoop-3.1.3]$ cat cut.txt | grep -C3 'sima yi'
zhang fei
syn quan
zhuge liang
sima yi
ma chao
huang zhong
xu chu

ps +grep的时候,容易把自己也过滤出来,导致判断进程状态失误,所以需要加入-v来进行排除

[root@hadoop102 hadoop-3.1.3]# ps -ef |grep crond
root       1107      1  0 09:52 ?        00:00:00 /usr/sbin/crond -n
root       5706   5617  0 14:46 pts/0    00:00:00 grep --color=auto crond
[root@hadoop102 hadoop-3.1.3]# ps -ef | grep -c crond
2
[root@hadoop102 hadoop-3.1.3]# pkill crond
[root@hadoop102 hadoop-3.1.3]# ps -ef | grep crond
root       5720   5617  0 14:46 pts/0    00:00:00 grep --color=auto crond
[root@hadoop102 hadoop-3.1.3]# ps -ef | grep -c crond
1
[root@hadoop102 hadoop-3.1.3]# ps -ef  | grep crond | grep -v grep | wc -l
0
[root@hadoop102 hadoop-3.1.3]# cat cut2.txt 
thank
thankyou
the
thread
ok 
yes
[root@hadoop102 hadoop-3.1.3]# cat cut2.txt | grep thank
thank
thankyou
[root@hadoop102 hadoop-3.1.3]# cat cut2.txt | grep -w thank
thank

2 sed 指令

2.1 sed特点及格式

sed stream editor 流编辑器,sed把处理的内容(文件)当做是水,源源不断的进行处理,直到文件末尾
sed格式

命令选项(s)sed命令功能(g)修饰符参数(文件)
sed-r‘s#word1#word2#g’cut.txt

sed命令核心功能:增删改查

功能
s替换substitute
p显示print
d删除delete
cai增加c/a/i

2.2 sed执行过程

找谁干啥 找谁:要找哪一行;干啥:增删查改
请添加图片描述

2.3 sed核心应用

(1)sed-查找p

查找格式
‘3p’指定行号进行查找
‘1,5p’指定行号范围进行查找
‘/zhang/p’类似于grep,过滤,//里面可以写正则
‘/10:00/,/11:00/p’表示范围的过滤
‘1,/zhang/p’混合
[root@hadoop102 hadoop-3.1.3]# sed -n '3p' cut.txt 
zhang fei
[root@hadoop102 hadoop-3.1.3]# sed -n '1,5p' cut.txt 
guan yu
liu bei
zhang fei
syn quan
zhuge liang
[root@hadoop102 hadoop-3.1.3]# #从第5行到最后1行
[root@hadoop102 hadoop-3.1.3]# sed -n '5,$p' cut.txt 
zhuge liang
sima yi
ma chao
huang zhong
xu chu
yuan shao
lv bu
chen gong
wei yan
ma teng
jiang wei
[root@hadoop102 hadoop-3.1.3]# sed -n '/ma/p' cut.txt 
sima yi
ma chao
ma teng

表示范围过滤的时候,如果结尾的内容匹配不到就是一直显示到最后一行

(2)sed-删除d

删除格式
‘3d’指定行号进行删除
‘1,5d’指定行号范围进行删除
‘/zhang/d’类似于grep,删除,//里面可以写正则
‘/10:00/,/11:00/d’表示范围的删除
‘1,/zhang/d’混合

案例:删除文件中的空行和包含井号的行

egrep -v '^$|#' /etc/ssh/sshd_config
sed -r '/^$|#/d' /etc/ssh/sshd_config

# !的妙用
# 遇到空行和#不显示
sed -nr '/^$|#/!p' /etc/ssh/sshd_config

`(3)sed-增加cai

命令
creplace 代替这行的内容
aappend 追加,向指定的行或每一行追加内容(行后面)
iinsert插入,向指定的行或每一行插入内容(行前面)
[root@hadoop102 hadoop-3.1.3]# cat cut2.txt 
thank
thankyou
the
thread
ok 
yes
[root@hadoop102 hadoop-3.1.3]# sed '3c sleep' cut2.txt 
thank
thankyou
sleep
thread
ok 
yes
[root@hadoop102 hadoop-3.1.3]# sed '3a hello' cut2.txt 
thank
thankyou
the
hello
thread
ok 
yes
[root@hadoop102 hadoop-3.1.3]# sed '3i class' cut2.txt 
thank
thankyou
class
the
thread
ok 
yes

案例:向config里面追加
UseDNS no
GSSAPIAUTCATION no
PermitRootLogin no

# 方法1:
cat >> config << 'EOF'
UseDNS no
GSSAPIAUTCATION no
PermitRootLogin no
EOF

# 方法2: sed
sed '$a UseDNS no\nGSSAPIAUTCATION no\nPermitRootLogin no' config

(4)sed-替换s
s --> substitute 替换
g --> global 全局替换每行所有匹配的内容,sed默认只替换每行第一个匹配的内容

替换格式
s###g
s///g
s@@@g
三个相同的字符就行

例1:将123456变为<123456>

[root@hadoop102 hadoop-3.1.3]# # 后向引用
[root@hadoop102 hadoop-3.1.3]# echo 123456 | sed -r 's/(.*)/<\1>/g'
<123456>
[root@hadoop102 hadoop-3.1.3]# echo 123456 | sed -r 's#(.*)#<\1>#g'
<123456>

例2: 交换两个单词的位置
将hello world变为world hello

[root@hadoop102 hadoop-3.1.3]# echo hello world | sed -r 's#(^.*) (.*$)#\2 \1#g'
world hello

例3:向文件的每一行末尾添加*****

[root@hadoop102 hadoop-3.1.3]# cat cut2.txt 
thank
thankyou
the
thread
ok 
yes
[root@hadoop102 hadoop-3.1.3]# sed 's#$#*****#g' cut2.txt 
thank*****
thankyou*****
the*****
thread*****
ok*****
yes*****

例4:提取文本中的ip地址

[root@hadoop102 hadoop-3.1.3]# ip a s ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:58:76:92 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.102/24 brd 192.168.10.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::7a43:7c71:c245:f91b/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@hadoop102 hadoop-3.1.3]# ip a s ens33 | sed -n '3p' | sed -r 's#^.*t (.*)/.*$#\1#g'
192.168.10.102
[root@hadoop102 hadoop-3.1.3]# ip a s ens33 | sed -rn '3s#^.*t (.*)/.*$#\1#gp'
192.168.10.102

3 awk 指令

3.1 awk执行过程

在这里插入图片描述

3.2 awk之行与列

名词awk中叫法说明
记录record每一行默认通过回车分割
字段, 域, field每一列默认通过空格分割
awk中行和列结标记都是可以修改的
内置变量
NRNumber of Record 记录号,行号
NFNumber of Field 每行有多个字段(列)$NF表示最后一列
FS-F: ===-vFS=:字段分隔符,每个字段结束标记
OFSOut Field Separator 输出字段分隔符(awk显示每一列的时候,每一列之间通过什么分割,默认是空格)

(1)取行

awk
NR==1取出第一行
NR>=1 && NR<=5取出第1行到第5行
/101/, /105/取出101到105行的内容
符号> < == >= <= !=
[Tom@hadoop102 hadoop-3.1.3]$ awk 'NR == 2' cut.txt 
liu bei
[Tom@hadoop102 hadoop-3.1.3]$ awk 'nr == 2' cut.txt 
[Tom@hadoop102 hadoop-3.1.3]$ awk 'NR >= 2 && NR <= 5' cut.txt 
liu bei
zhang fei
syn quan
zhuge liang
[Tom@hadoop102 hadoop-3.1.3]$ awk '/liu/,/sima/' cut.txt 
liu bei
zhang fei
syn quan
zhuge liang
sima yi

(2)取列
-F 指定分隔符,指定每一列结束标记(默认是空格,连续的空格,tab键)
$数字 取出某一列,
$0表示取整行的内容
$NF表示取最后一列的内容

[Tom@hadoop102 hadoop-3.1.3]$ awk '{print $1}' cut.txt 
guan
liu
zhang
syn
zhuge
sima
ma
huang
xu
yuan
lv
chen
wei
ma
jiang
[Tom@hadoop102 hadoop-3.1.3]$ # column -t 表示列对齐
[Tom@hadoop102 hadoop-3.1.3]$ head -5 /etc/passwd |awk -F: '{print $1, $NF}'|column -t
root    /bin/bash
bin     /sbin/nologin
daemon  /sbin/nologin
adm     /sbin/nologin
lp      /sbin/nologin
[Tom@hadoop102 hadoop-3.1.3]$ head -5 /etc/passwd |awk -F: -vOFS=: '{print $1, $NF}'|column -t
root:/bin/bash
bin:/sbin/nologin
daemon:/sbin/nologin
adm:/sbin/nologin
lp:/sbin/nologin

例:取ip地址

[Tom@hadoop102 hadoop-3.1.3]$ ip a s ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:58:76:92 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.102/24 brd 192.168.10.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::7a43:7c71:c245:f91b/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[Tom@hadoop102 hadoop-3.1.3]$ ip a s ens33 | awk 'NR==3' | awk -F"[ /]+" '{print $3}'
192.168.10.102
[Tom@hadoop102 hadoop-3.1.3]$ ip a s ens33 | awk -F"[ /]+" 'NR==3{print $3}'
192.168.10.102

3.3 awk之模式匹配

awk-F"[ /]+"‘NR==3{print $3}’
命令选项条件(动作)‘pattern{action}’

可以作为awk的条件有:
比较符号:> < >= <= == !=

[Tom@hadoop102 hadoop-3.1.3]$ awk 'NR>=10{print $1}' cut.txt 
yuan
lv
chen
wei
ma
jiang

正则表达式:~包含;!~不包含

[Tom@hadoop102 hadoop-3.1.3]$ # 找出第三列以2开头的行,并显示第1列,第3列和最后一列
[Tom@hadoop102 hadoop-3.1.3]$ awk -F: '$3~/^2/{print $1, $3, $NF}' /etc/passwd
daemon 2 /sbin/nologin
rpcuser 29 /sbin/nologin
mysql 27 /bin/false
[Tom@hadoop102 hadoop-3.1.3]$ # 找出第3列以1或2开头的行,并显示第1列,第3列和最后一列
[Tom@hadoop102 hadoop-3.1.3]$ awk -F: '$3~/^[12]/{print $1, $3, $NF}' /etc/passwd | column -t
bin              1     /sbin/nologin
daemon           2     /sbin/nologin
operator         11    /sbin/nologin
games            12    /sbin/nologin
ftp              14    /sbin/nologin
systemd-network  192   /sbin/nologin
abrt             173   /sbin/nologin
rtkit            172   /sbin/nologin
pulse            171   /sbin/nologin
qemu             107   /sbin/nologin
usbmuxd          113   /sbin/nologin
rpcuser          29    /sbin/nologin
huxili           1000  /bin/bash
mysql            27    /bin/false
Tom              1001  /bin/bash

范围表达式

[Tom@hadoop102 hadoop-3.1.3]$ awk '/zhang/,/ma/{print $1}' cut.txt 
zhang
syn
zhuge
sima

特殊条件:BEGIN和END

模式含义应用场景
BEGIN{}里面的内容会在awk读取文件之前执行1)进行简单统计,计算,不涉及读取文件
2)用来处理文件之前,添加表头
3)用来定义awk变量
END{}里面的内容会在awk读取文件之后执行1)awk进行统计,一般过程:先进行计算,最后END里面输出结果
2)awk使用数组,用来输出结果

例1:统计/etc/serivces 里面有多少个空行

[Tom@hadoop102 hadoop-3.1.3]$ #
[Tom@hadoop102 hadoop-3.1.3]$ awk '/^$/' /etc/services | wc -l
17
[Tom@hadoop102 hadoop-3.1.3]$ awk '/^$/{i++}END{print i}' /etc/services
17

例2:求和1+2+…+100

[Tom@hadoop102 hadoop-3.1.3]$ seq 100 | awk '{sum=sum+$1}END{print sum}'
5050

3.4 awk数组

shell数组awk数组
形式array[0] = mary
array[1]=jack
array[0] = mary
array[1]=jack
使用echo ${array[0]}
${array[1]}
print array[0]
array[1]
批量输出数组内容for i in ${array[*]}
do
echo $i
done
for (i in array)
print array[i]
[Tom@hadoop102 hadoop-3.1.3]$ awk 'BEGIN{a[0]=123;a[1]=you;print a[0],a[1]}'
123 
[Tom@hadoop102 hadoop-3.1.3]$ # awk字母会被识别为变量,如果只是想使用字符串需要使用双引号引起来
[Tom@hadoop102 hadoop-3.1.3]$ awk 'BEGIN{a[0]=123;a[1]="you";print a[0],a[1]}'
123 you

例:处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和sohu面试题)

http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
[root@hadoop102 hadoop-3.1.3]# awk -F"[./]+" '{array[$2]++}END{for(i in array)print i, array[i]}' url.txt 
www 3
mp3 1
post 2
[root@hadoop102 hadoop-3.1.3]# # rnk中r表示逆序,n表示数字,k2表示第2列
[root@hadoop102 hadoop-3.1.3]# awk -F"[./]+" '{array[$2]++}END{for(i in array)print i, array[i]}' url.txt | sort -rnk2
www 3
post 2
mp3 1

3.5 awk循环与判断

例1:统计1+2+3+…+100的和

[root@hadoop102 hadoop-3.1.3]# awk 'BEGIN{for(i=1;i<=100;++i)sum+=i;print sum}'
5050

例2:统计磁盘空间使用率,如果大于50%,则提示磁盘空间不足,并显示磁盘分区,磁盘使用率,磁盘挂载点

[Tom@hadoop102 ~]$ df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 893M     0  893M    0% /dev
tmpfs                    910M     0  910M    0% /dev/shm
tmpfs                    910M   11M  900M    2% /run
tmpfs                    910M     0  910M    0% /sys/fs/cgroup
/dev/mapper/centos-root   47G   26G   22G   55% /
/dev/sda1                976M  156M  754M   18% /boot
tmpfs                    182M  8.0K  182M    1% /run/user/42
tmpfs                    182M     0  182M    0% /run/user/1000
[Tom@hadoop102 ~]$ df -h | awk -F"[ %]+" 'NR>1{if($5>=50) print"disk not enough",$1,$5,$NF}'
disk not enough /dev/mapper/centos-root 55 /

注意:awk使用多个条件的时候,第1个条件可以放在’条件{动作}',第2个条件一般使用if

例3:统计这段语句中,单词中字符数小于6的单词,显示出来

[Tom@hadoop102 ~]$ echo I am math teacher welcome to math training class.|awk -F"[ .]" '{for(i=1;i<=NF;++i)if(length($i)<6) print $i}'
I
am
math
to
math
class


参考: https://www.bilibili.com/video/BV1Kg411g7bC?p=25&spm_id_from=pageDriver

<think>我们正在介绍Linux常用命令:find, grep, sed, awk, man, which, env。每个命令将包括: 1. 命令简介 2. 基本语法 3. 常用选项参数 4. 使用场景举例 5. 注意事项(如有) 注意:根据引用[1],不同系统(如BSDGNU)的命令可能有差异,我们以GNU版本(Linux常见)为主。 首先,我们列出这些命令的简要说明: - `find`: 在目录树中查找文件并执行操作 - `grep`: 在文件中搜索匹配模式的行 - `sed`: 流编辑器,用于文本转换 - `awk`: 强大的文本处理工具,也可用于数据提取报告生成 - `man`: 查看命令的手册页 - `which`: 定位命令的完整路径 - `env`: 查看环境变量或设置临时环境运行程序 下面逐个详细介绍。 ### 1. `find` 命令 **简介**:在指定目录下查找文件,支持按名称、类型、时间、权限等属性搜索,并可对查找到的文件执行操作。 **基本语法**: ```bash find [路径] [表达式] ``` **常用选项**: - `-name`: 按文件名匹配(支持通配符) - `-type`: 按文件类型(f:普通文件, d:目录, l:符号链接等) - `-mtime`: 按修改时间(天数,+n表示n天前,-n表示n天内) - `-exec`: 对查找到的文件执行命令(用`{}`代表文件名,命令以`\;`结束) - `-size`: 按文件大小(如`+1M`表示大于1MB) **使用场景**: 1. 查找当前目录下所有`.txt`文件: ```bash find . -name "*.txt" ``` 2. 查找/home目录下大于1MB的文件并列出详细信息: ```bash find /home -size +1M -exec ls -l {} \; ``` 3. 删除/tmp目录下7天前的临时文件: ```bash find /tmp -type f -mtime +7 -exec rm {} \; ``` **注意事项**: - 使用通配符(如`*`)时,建议用引号括起模式(如`"*.txt"`),避免shell提前展开。 - 使用`-exec`时,`{}``\;`是固定格式,不可省略。 ### 2. `grep` 命令 **简介**:在文件中搜索匹配指定模式的行,支持正则表达式。 **基本语法**: ```bash grep [选项] 模式 [文件...] ``` **常用选项**: - `-i`: 忽略大小写 - `-r` 或 `-R`: 递归搜索目录 - `-n`: 显示匹配行的行号 - `-v`: 反向匹配(显示不包含模式的行) - `-E`: 使用扩展正则表达式(等同于`egrep`) **使用场景**: 1. 在当前目录所有文件中搜索包含`error`的行(忽略大小写): ```bash grep -ri "error" . ``` 2. 查找`/etc/passwd`中不含`/bin/bash`的行(即非bash用户): ```bash grep -v "/bin/bash" /etc/passwd ``` 3. 使用正则表达式匹配IP地址(需要`-E`): ```bash echo "192.168.1.1" | grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' ``` **注意事项**: - 模式中若包含特殊字符(如`$`, `*`),需用单引号括起。 - 递归搜索时,`-r``-R`在大多数Linux发行版中行为相同,但在某些系统(如macOS)中`-R`会跟随符号链接。 ### 3. `sed` 命令 **简介**:流编辑器,用于对输入流(文件或管道)进行文本转换(如替换、删除、插入)。 **基本语法**: ```bash sed [选项] '指令' [输入文件] ``` **常用指令**: - `s/模式/替换/`: 替换匹配模式的文本(可加`g`表示全局替换) - `d`: 删除行 - `p`: 打印行(通常与`-n`选项配合使用) - `a\text`: 在行后追加文本 - `i\text`: 在行前插入文本 **使用场景**: 1. 替换文件中的字符串(原文件不变,输出到屏幕): ```bash sed 's/foo/bar/g' file.txt ``` 2. 直接修改文件(使用`-i`选项): ```bash sed -i 's/foo/bar/g' file.txt ``` 3. 删除空白行: ```bash sed '/^$/d' file.txt ``` **注意事项**: - `-i`选项会直接修改文件,建议先备份或测试无误后再使用。 - 指令中的分隔符`/`可替换为其他字符(如`s|foo|bar|g`),避免与模式中的`/`冲突。 ### 4. `awk` 命令 **简介**:强大的文本处理工具,按行处理,自动分割字段(默认空格分隔),支持编程结构(如条件、循环)。 **基本语法**: ```bash awk '模式 {动作}' [文件] ``` **常用变量**: - `$0`: 整行内容 - `$1`, `$2`, ...: 第1、2个字段 - `NF`: 当前行的字段数 - `NR`: 当前行号 - `FS`: 输入字段分隔符(默认为空格) - `OFS`: 输出字段分隔符(默认为空格) **使用场景**: 1. 打印文件每行的第一个字段(如`/etc/passwd`的用户名): ```bash awk -F: '{print $1}' /etc/passwd ``` 2. 统计文件行数: ```bash awk 'END {print NR}' file.txt ``` 3. 计算第1列数字之: ```bash awk '{sum+=$1} END {print sum}' data.txt ``` **注意事项**: - 指定分隔符用`-F`(如`-F:`表示冒号分隔)。 - 引用变量时无需加`$`(如`NR`),而字段需要(如`$1`)。 ### 5. `man` 命令 **简介**:查看命令、函数或配置文件的手册页(manual pages)。 **基本语法**: ```bash man [章节] 名称 ``` **常用章节**: - 1: 用户命令 - 2: 系统调用 - 3: 库函数 - 5: 文件格式(如配置文件) - 8: 系统管理命令 **使用场景**: 1. 查看`ls`命令的用法: ```bash man ls ``` 2. 查看`open`系统调用的文档(需指定章节): ```bash man 2 open ``` **注意事项**: - 按`q`退出手册页。 - 若名称同时存在于多个章节(如`printf`命令函数),可用`man 1 printf``man 3 printf`区分。 ### 6. `which` 命令 **简介**:定位命令的完整路径(在`$PATH`环境变量中查找)。 **基本语法**: ```bash which 命令名 ``` **使用场景**: 1. 查看`ls`命令的路径: ```bash which ls # 输出:/bin/ls ``` 2. 检查命令是否存在: ```bash which some_command > /dev/null && echo "存在" || echo "不存在" ``` **注意事项**: - 仅搜索`$PATH`中的目录,不会查找别名或内置命令(如`cd`)。 ### 7. `env` 命令 **简介**:查看当前环境变量,或设置临时环境运行程序。 **基本语法**: ```bash env [选项] [变量=值]... [命令] ``` **使用场景**: 1. 显示所有环境变量: ```bash env ``` 2. 临时修改环境变量运行程序(如设置`LANG`): ```bash env LANG=C date ``` 3. 清除所有环境变量后运行程序(`-i`选项): ```bash env -i /path/to/program ``` **注意事项**: - 临时设置的环境变量仅影响后续执行的命令,不影响当前shell环境。 ### 总结 以上命令是Linux系统管理、文本处理日常使用的核心工具。熟练掌握它们能极大提高工作效率。注意不同系统(如BSDGNU)的差异,如引用[1]所述,跨平台脚本需谨慎使用这些命令或考虑Python/Perl替代。 §§相关问题§§ 1. 如何组合使用`find``grep`进行复杂搜索? 2. `sed``awk`在文本处理中有哪些典型区别? 3. 如何通过`man`手册快速查找特定选项的说明? 4. 在脚本中如何安全地使用`find`的`-exec`选项? 5. `env`命令在脚本开发中的常见用途有哪些?</think>### Linux 常用命令详解 #### 1. `find`:文件搜索工具 **用途**:在目录树中递归搜索文件,支持按名称、类型、时间、权限等条件过滤 **基本语法**: ```bash find [路径] [表达式] ``` **常用场景**: - 按名称搜索:`find /home -name "*.txt"`(查找/home下所有txt文件)[^2] - 按类型搜索:`find . -type d`(查找当前目录所有子目录) - 按时间过滤:`find /var/log -mtime -7`(查找7天内修改的文件) - 结合执行操作:`find ~ -size +10M -exec rm {} \;`(删除大于10MB的文件) **注意**:BSDGNU版本参数有差异,跨平台需谨慎[^1] --- #### 2. `grep`:文本搜索工具 **用途**:在文件或输入流中匹配正则表达式 **基本语法**: ```bash grep [选项] 模式 [文件] ``` **常用场景**: - 基础搜索:`grep "error" /var/log/syslog`(搜索包含error的行) - 递归搜索:`grep -r "TODO" src/`(递归搜索源码目录) - 显示行号:`grep -n "pattern" file`(显示匹配行号) - 反向过滤:`grep -v "#" config.conf`(过滤注释行) **特殊技巧**: ```bash ps aux | grep "[n]ginx" # 精确匹配进程(避免匹配grep自身) ``` --- #### 3. `sed`:流编辑器 **用途**:对文本流进行替换、删除、插入等操作 **基本语法**: ```bash sed [选项] '指令' 文件 ``` **核心操作**: | 指令 | 作用 | 示例 | |----------|--------------------------|-------------------------------| | `s/old/new/` | 替换文本 | `sed 's/foo/bar/g' file` | | `/pattern/d` | 删除匹配行 | `sed '/^#/d' config` | | `5i\text` | 在第5行前插入文本 | `sed '3i\# New Line' file` | **典型场景**: - 批量替换:`sed -i.bak 's/old/new/g' *.txt`(备份并替换) - 删除空行:`sed '/^$/d' input.txt > output.txt` --- #### 4. `awk`:文本处理语言 **用途**:字段提取、数据统计、报告生成 **基本语法**: ```bash awk '模式 {动作}' 文件 ``` **核心概念**: - `$0`:整行内容 - `$1, $2...`:第1、2个字段 - `NR`:行号,`NF`:字段数 **常用场景**: - 提取字段:`awk -F: '{print $1}' /etc/passwd`(输出用户名) - 条件过滤:`awk '$3 > 1000 {print $0}' data.csv`(过滤第三列大于1000的行) - 数据统计: ```bash awk '{sum+=$1} END {print "Average:", sum/NR}' numbers.txt ``` --- #### 5. `man`:手册查看 **用途**:查看命令/系统调用的文档 **基本语法**: ```bash man [章节] 命令名 ``` **手册章节**: 1. 用户命令 2. 系统调用 3. 库函数 **技巧**: - `man -k keyword`:搜索相关手册(如`man -k "socket"`) - 导航:空格翻页,`/pattern`搜索,`q`退出 --- #### 6. `which`:命令定位 **用途**:查找命令的绝对路径 **示例**: ```bash $ which python /usr/bin/python # 显示第一个匹配路径 ``` **注意**:仅搜索`$PATH`变量中的路径 --- #### 7. `env`:环境管理 **用途**:查看/设置环境变量,临时修改环境执行命令 **常用操作**: - 查看所有环境变量:`env` - 临时修改变量: ```bash env LANG=C python script.py # 临时使用C语言环境执行 ``` - 清空环境执行:`env -i command`(无继承环境) --- ### 命令组合实战 **场景**:统计nginx日志中404错误的IP分布 ```bash grep " 404 " access.log | awk '{print $1}' | sort | uniq -c | sort -nr ``` 1. `grep`过滤404错误 2. `awk`提取IP地址(第1列) 3. `sort`排序 4. `uniq -c`统计重复次数 5. `sort -nr`按次数倒序排列 --- ### 注意事项 1. BSD(如MacOS)与GNU命令存在差异,跨平台脚本建议测试或使用Python/Perl替代[^1] 2. 变量引用用`${var}`避免歧义(如`${var}_suffix`)[^3] 3. 脚本参数处理:`$0`脚本名,`$1`第一个参数,`$#`参数个数[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值