文本操作命令

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值