grep
fgrep : 不支持正则与通配符
grep : 支持一般正则
egrep :支持所有的正则,包括扩展正则字符
常用参数:
-i : 忽略大小写
-n : 显示行号
-w : 精确匹配
-v :反选
-E : 开启完整正则支持,支持扩展的正则表达式
-R:递归
-o : 只打印匹配的内容
grep "root" /etc/passwd --在passwd过滤root关键字
grep -o "root" /etc/passwd ---只打印匹配的字符创建
grep -i "root" /etc/passwd --忽略大小写
grep -n -i "root" /etc/passwd --忽略大小写并输入行号
grep -v "root" /etc/passwd -v除了root这个关键字
grep -v '^' /etc/passwd ^ 空行
grep '^root' /etc/passwd ^root以root开头
grep 'bash' /etc/passwd bash以bash结尾
grep -w “^root” /etc/passwd 精确匹配以root单词开头的内容,例如rootabc则不满足,root:abc 匹配
grep -vE "^#|^$" /etc/ssh/sshd_config “-E”开启扩展正则字符支持
grep -Rl "pthread_create" /usr/include/ 在/usr/include找包含pthread_create内容的文件
grep -Rn "hello" /usr/share/ 在/usr/share目录中查找文件中内容包含"hello"的文件 n 列出 hello所在的行号
awk
-F 指定分隔符
可以编写awk程序,语法与c语言完全一致
BEGIN{}起始段,仅在最开始执行第一次,用于初始化变量等
{}正文段,文件的每一行都会执行一次正文段,用于具体的处理
END{}结束段,仅在处理文件所有行之后执行一次,用于结果打印
使用数据字段变量
$0 整行文本
$1 第一个字段
$n 第n个字段
显示每个文件的名字和大小(没有指定 -F 分隔符号 则默认以 空格为分隔符)',' 在print中实现为一个分隔符
# ll - l | awk '{print $9,$5}'
""双引号中的内容在print中直接打印
# ll - l | awk '{print $9 “ ” $5}'
在程序中执行多个命令,命令间分号分隔
# ll | awk '{printf ("%s ",$8);print $5}'
AWK 变量----------AWK支持两种类型变量:
内置变量 FS NR NF FNR FIELDWIDTHS
用户自定义变量
内置变量:FS 字段分隔符,对应option参数 -F
NF 输入文件中字段数
# awk -F: '{print NF}' /etc/passwd ---打印内置变量NF的值
# awk -F: '{print $NF}' /etc/passwd ----提取 第 NF个字段内容
# awk -F: '{print "NF"}' /etc/passwd ----直接打印 NF 字符串
NR 已处理的记录个数
FNR 文件记录号(文件行号)
FIELDWIDTHS 字段宽度
自定义变量:组成字符:字母、数字、下划线,但不能以数字开头。
AWK变量区分大小写,引用变量时,与SHELL不同大部分不要在前面加 $ ,只有一些特殊的变量前加$,如 $n 取第n个字段
sed
-n 屏蔽默认输出(全部文本)
-i 直接修改文件内容
-f 使用sed脚本,用于指定脚本文件地址
-e 可以指定处理动作表达式
-r 启用扩展的正则表达式,当与其他选项使用时应作为首个选项
- 删除(过滤输出)d
指定删除第一行
# sed -e '1d' /etc/passwd
删除第二行到第四行
# sed -e '2,4d' /etc/passwd
删除第二和第四行
# sed -e '2d;4d' /etc/passwd
删除末行
# sed -e '$d' /etc/passwd
- 打印 p ,需要加-n参数屏蔽默认输出 <“1p"或者”/匹配条件/p">
打印第一行
# sed -ne '1p' /etc/passwd
打印匹配root开头的行
# sed -ne '/^root/p' /etc/passwd
打印以小写字母开头,和以nologin结尾的行
# sed -ne '/^[a-z]/p;/nologin$/p' /etcp/passwd
# sed -ne '/^[a-z]/p' -e '/nologin$/p' /etcp/passwd
打印以root开头 到 mail 开头的所有行
# sed -ne '/^root/,/^mail/p' /etc/passwd
打印以root开头和 以mail开头的行
# sed -ne '/^root/p;/^mail/p' /etc/passwd
打印(过滤)出有ip 地址记录行
# ifconfig ens33 | sed -nr '/(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/p'
ps:如果针对ifconfig ens33的IP可以不考虑IP数值范围,仅考虑格式即可
# ifconfig ens33 | sed -nr '/([0-9]+\.){3}[0-9]+/p'
-
替换 s , ‘s/被替换的/替换为/指定替换范围’
替换范围:g 代表匹配;1代表每一行匹配第1个(默认);2代表每一行匹配第2个
把每行的第一个root替换成kyo
# sed -e 's/root/kyo/' /etc/passwd
把每行的所有root替换成kyo
# sed -e 's/root/kyo/g' /etc/passwd
把每行的第二个root替换成kyo
# sed -e 's/root/kyo/2' /etc/passwd
把网络配置文件的DNS1整行替换
# sed 's/.*DNS1=.*$/DNS1=8.8.8.8/' /etc/sysconfig/network-scripts/ifcfg-ens33
将文件第一行的所有小写字母替换为 '-'
# sed -r '1s/[a-z]/-/g' /etc/passwd
- 插入内容,i 在行之前插入新行,a 在行之后插入新行,c 在本行操作
-i 参数实际操作文件,谨慎使用!!!
在每行前插入一行的新的内容"new line"
# sed -r "inew line" txt
# sed -r "i\new line" txt
# sed -r "a\new line" txt
在第一行前插入一行新的内容"new line"
# sed -r "1inew line" txt
# sed -r "1anew line" txt
在第2到5行前插入一行性的内容"new line"
# sed -r "2,5inew line" txt
使用域进行定位:
s / ( ) ( ) ( ) / / 中的一组 ( ) 定义为一个域,并且将匹配这个表达式保存到一个区域,一个正则表达式最多可以保存9个域,访问域\1到\9来表示
-r 不需要转义直接() 如果没有-r 就要用() 转意
删除每行的第一个字符
# sed -e 's/.(.)/\1/'
# sed -r 's/.(.)/\1/'
删除每行的第二个字符
# sed -e 's/(.).(.)/\1\2/'
# sed -e 's/(.).(.)/\1\2/'
删除最行最后一个字符
# sed -e 's/(.*)./\1/''
- 删除换行符
# sed ':label;N;s/\n//;b label' filename
# sed ':label;N;s/\n//;t label' filename
:label; 这是一个标签,用来实现跳转处理,名字可以随便取(label),后面的b label就是跳转指令
N; N是sed的一个处理命令,追加文本流中的下一行到模式空间进行合并处理,因此是换行符可见
s/\n//; s是sed的替换命令,将换行符替换为无,相当于删除
b label 或者 t label , b / t 是sed的跳转命令,跳转到指定的标签处
标签跳转和N的追加命令实现了每一行的不间断放入模式处理空间,从而不会漏掉每一个换行符,而没有标签的话跳转的话,就只能每两行替换掉一个换行符,对比效果:
# echo "a,b,c,d"|sed -r 's/,/\n/g'|sed -r 'N;s/\n//'
ab
cd
# echo "a,b,c,d"|sed -r 's/,/\n/g'|sed -r ':x;N;s/\n//;b x'
abcd
locate
基于数据库查找文件,第一安装时,updatedb更新生成数据文件 /var/lib/mlocate/mlocate.db
用locate命令之前要手动更新数据库
updatedb ----手工更新数据库
locate “lesson”
locate -r 'lessonoo.*' (-r参数支持用正则通配符)
locate -r '\.iso$' 找以'.iso'结尾的文件
find
find 路径 <查找方式>
-name 按照文件名查找文件
# find / -name "*.conf"
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
# find /etc/ -size 585c c代表字符 -585c 小于 +566c大于
# find /tmp/ -size 2 大于2块 -2小于2块
# find / -size +1G -a -size -2G ----指定常用单位(k<小写> M G)
# find /var/ -size +20M -a -size -30M -a -name "*pdf"
# find /var/ -size +20M -size -30M -name "*pdf"
# find /var/ -size +1000M -o -name "*.txt"
-perm 按照文件权限来查找文件。
# find / -perm 755
-user 按照文件属主来查找文件.
# find / -user student
-group 按照文件所属的组来查找文件。
# find / -group student
# find / -user vip01 ! -group upl_vip
-newer file1 查找更改时间比文件file1新但比文件file2旧的文件。
# find /home/ -newer /home/a_f_8 ----查找比/home/a_f_8 新的文件
# find /home/ ! -newer /home/a_f_8 ----查找比/home/a_f_8 老的文件
-type 查找某一类型的文件,诸如:
b- 块设备文件。d - 目录。c - 字符设备文件。 p - 管道文件。l - 符号链接文件。f - 普通文件。
#find /dev/ -type b
diff
对比两个文件,查看两个文件间不同的地方
-b 忽略空格引起的不同(针对字符后面的空格)
-i 忽略大小写
-B 忽略插入空行引起的变化(针对回车)
# diff /etc/passwd /tmp/passwd
uniq
去除连续的重复行
-c 统计重复的行数
-i 忽略大小写
-d 只显示重复的行
# uniq /tmp/passwd
# uniq -d /tmp/passwd | head -2 &> aa.txt
# sort 1.txt | uniq -i ---全文本去重
sort
排序(默认以字符排序)
-r 反向排序
-n 以数字来排序
-u 合并同类
-t 指定分隔符
-k 指定的列
# sort /etc/passwd ---按每行的首字符排序
# sort -t ':' -k3 -n /etc/passwd --- 以 : 为分隔,排序 第3字段(列) 按数字大小排序
# ls -l / | sed -r 's/[ ]{2,}/ /g' | sort -t ' ' -k 5 -nr ---将ls -l列出的属性以 内容size(第五字段) 进行反向排序,因为 sort -t不支持连续的分割符
cut
用于提取行间数据的特定内容
-b 以字节(byte)为单位提取内容
-c 以字为单位提取内容,其中中文的一个字也视为一个字
-d 指定分隔符,默认以\t(制表符)为分割
-f 以字段为单位提取,必然结合-d指定字段的分隔符
–output-delimiter=’ ;’ 将字段分隔符号输出时该变为 ‘;’ (用于提取过个字段输出时期望特定的格式分隔)
-s 如果数据中不包含 -d 指定分隔符标志的 行记录将排除
===========================================
-b n 提取第n个字符
-b n- 提取第n个字符和以后的所有字符
-b -n 提取第n个及以前的所有字符
-b n-m 提取第n个到第m个字符
-b n,m 提取第n个和第m个
===========================================
-c n
-c n-
-c -n
-c n-m
-c n,m
===========================================
-f n
-f n-
-f -n
-f n-m
-f n,m
============================================
# cut -b 3 /etc/passwd ---提取passwd文件的第三个字节
# cut -b 3- /etc/passwd ---提取passwd文件 从第3个字节到最后 的内容
# cut -b -3 /etc/passwd ---提取passwd文件 前3个字节 的内容
# cut -b 3-10 /etc/passwd ---提取passwd文件 第3个到第10个字节 的内容
# cut -b 3-10, 20 /etc/passwd ---提取passwd文件 第3个到第10个字节 以及第20个字节 的内容
# cut -c 3 /etc/passwd ---提取passwd文件的第三个字符
# cut -d':' -f 1- --output-delimiter=' ;' /etc/passwd ----提取passwd文件的所有字段 输出分隔符为';'
# cat txt
我 爱 中 国
# cut -b1-3 txt ----- 一个中文字由3个字节编码而成
我
# cut -c1 txt ---- -c 中文也视为一个字符
我
# cut -c1-3 /etc/passwd
# cut -d: -f7 /etc/passwd
# grep root /etc/passwd |cut -d : -f7 截取7字段
# grep root /etc/passwd |cut -d : -f1,7 截取1和7字段
# grep root /etc/passwd |cut -d : -f1-3 截取1到3字段
# head /etc/passwd | cut -d: -f1,2
# ifconfig | grep -w "inet" | cut -d' ' -f10
# cut -d: -f7 /etc/passwd | uniq -d | grep bash
wc
统计文件的行、词、字符数,但是,词的分隔符只识别空格、空行
-l 行数
-c 字符数
-w 单词数
# cut -d: -f7 /etc/passwd |sort |uniq|wc -l ---统计passwd文件中shell字段有几种值
# cat txt | sed -r 's/[^a-zA-Z0-9]/\ /g' | wc -w ----统计 txt 文件中有多少单词
tr
替换,只能接受输入重定向的文件流
-d 删除某个指定的字符串
# tr a-z A-Z < sort2.txt 替换所有小写变成大写
# cat sort2.txt | tr a-z A-Z1
# tr -d a < sort2.txt 删除字符'a'
# tr A-Z a-z < /etc/passwd 替换所有大写变成小写
# tr -d "a-z A-Z" < sort2.txt 删除所有大小写字母
# tr -d "[0-9][:][/]" < /tmp/passwd 删除任意数字或符号 ‘:’ 或符号‘/’
# tr -d "\n" < 1.txt ---删除1.txt文件中所有的回行符
# tr '[:digit:]' ' ' < 1.txt ---将所有的数字替换为空格
paste
合并两个文件,将文件对应的行合成一行
# paste /tmp/passwd /tmp/shadow
root:x:0:0:root:/root:/bin/bash root:$1$JHbAjuRY$cRnTawig2A8mUNj4ZX9DW1:15194:0:99999:7:::
tee
# head /etc/passwd > 10.txt
# tail /etc/passwd | tee 10.txt
将文件的小写转换为大写
# tr "a-z" "A-Z" < 10.txt | tee 10.txt