您的位置:首页 > 运维架构 > Shell

shell文本处理

2019-03-19 19:33 148 查看

grep
Global search grepregular expression and print out the
line
全面搜索研究正则表达式并显示出来
grep 命令是一种强大的文本搜索工具 , 根据用户指定的“模
式”对目标文本进行匹配检查 , 打印匹配到的行
由正则表达式或者字符及基本文本字符所编写的过滤条件grep
匹配条件
处理文件
例如
grep 匹配条件 处理文件
grep root passwd
grep ^root passwd
grep root$ passwd
grep -i root passwd
grep -E “root|ROOT” passwd

grep 中的正则表达式
^westos
westos$
‘w…s’
‘w…’
‘…s’

grep 中字符的匹配次数设定

  • 字符出现 [0- 任意次 ]

grep -E “x*y” xy
? 字符出现 [0-1 次 ]
grep -E “x?y” xy
+ 字符出现 [1- 任意次 ]
grep -E “x+y” xy
{n} 字符出现 [n 次 ]

|{m,n} 字符出现 [ 最少出现 m 次,最多出现 n 次 ]
{0,n} 字符出现 [0-n 次 ]
{m,} 字符出现 [ 至少 m 次 ]
(xy){n}xy 关键字出现 [n 次 ]
.* 关键字之间匹配任意字符

grep 中字符的匹配位置设定#防止关键字的扩展
^ 关键字 ##关键字作为开头
关键字 $ ##关键字作为末尾
< 关键字 ##关键字前无字符
关键字 > ##关键字后无字符
< 关键字 > ##只有关键字
root@desktop mnt]# grep root passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
[root@desktop mnt]# vim passwd
[root@desktop mnt]# grep root passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
root:tes:ROOT
kmds:roottest:ess
sd:dsd:root
sfdsa:sfds:testroot
sdfs:dsd:root
ldkas:root:sasd
[root@desktop mnt]# grep -i root passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
root:tes:ROOT
ROOTtest:Rot:ds
ROOT:eswe:sads
kmds:roottest:ess
sd:dsd:root
sfdsa:sfds:testroot
sdfs:dsd:root
ldkas:root:sasd
[root@desktop mnt]# grep -i “<root” passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
root:tes:ROOT
ROOTtest:Rot:ds
ROOT:eswe:sads
kmds:roottest:ess
sd:dsd:root
sdfs:dsd:root
ldkas:root:sasd
[root@desktop mnt]# grep -i “<root<” passwd
[root@desktop mnt]# grep -i “<root>” passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
root:tes:ROOT
ROOT:eswe:sads
sd:dsd:root
sdfs:dsd:root
ldkas:root:sasd
[root@desktop mnt]# grep -i “^root>” passwd
root❌0:0:root:/root:/bin/bash
root:tes:ROOT
ROOT:eswe:sads
[root@desktop mnt]# grep -i “<rootKaTeX parse error: Expected 'EOF', got '#' at position 69: …ot@desktop mnt]#̲ grep -i "^root…” passwd
[root@desktop mnt]# vim passwd
[root@desktop mnt]# grep -i “^root>|<rootKaTeX parse error: Expected 'EOF', got '#' at position 29: …ot@desktop mnt]#̲ grep -iE "^roo…” passwd
root❌0:0:root:/root:/bin/bash
root:tes:ROOT
ROOT:eswe:sads
sd:dsd:root
sdfs:dsd:root
root:df:root
[root@desktop mnt]# grep -iE “^root>|<rootKaTeX parse error: Expected 'EOF', got '#' at position 582: …ot@desktop mnt]#̲ grep -iE "^roo…” passwd -v | grep “<root>”
operator❌11:0:operator:/root:/sbin/nologin
ldkas:root:sasd

grep 正则表达式与扩展正则表达式
正规的 grep 不支持扩展的正则表达式子 , 竖线是用于表示”
或”的扩展正则表达式元字符 , 正规的 grep 无法识别
加上反斜杠 , 这个字符就被翻译成扩展正则表达式 , 就像 egrp

grep -E 一样

sed
行编辑器
stream editor
用来操作纯 ASCII 码的文本
处理时 , 把当 前处理的行存储在临时缓冲区中 , 称为“模式空
间” (pattern space) 可以指定仅仅处理哪些行
sed 符合模式条件的处理 不符合条件的不予处理
处理完成之后把缓冲区的内容送往屏幕
接着处理下一行 , 这样不断重复 , 直到文件末尾

Sed 命令格式
调用 sed 命令有两种形式:
sed [options] ‘command’ file(s)
sed [options] -f scriptfile file(s)

sed 对字符的处理

p显示
d删除
a添加
c替换
w写入
i插入

p 模式操作
sed -n ‘/:/p’ fstab
sed -n ‘/UUID$/p’ fstab
sed -n ‘/^UUID/p’ fstab
sed -n ‘2,6p’ fstab
sed -n ‘2,6!p’ fstab

cat fstab

/etc/fstab

Created by anaconda on Wed May 7 01:22:57 2014

Accessible filesystems, by reference, are maintained under ‘/dev/disk’

See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
/dev/vg0/vo /home ext4 defaults 0 0
/dev/sr0 /var/www/html/rhel7.3 iso9660 defaults 0 0

sed -n /#/p fstab ##只查看#行
sed -n '/#/!'p fstab ##只查看没有#的行-n 抑制模式空间里图形的输出
cat -n|-b ##-b显示行号但忽略空行;-n不忽略空行
cat -n fstab | sed -n ‘2,6p’ ##显示2到6行
cat -n fstab | sed -n -e ‘2p’ -e ‘6p’##显示2和6行
cat -n fstab | sed -n -e ‘2p;6p’##显示2和6行
cat -n fstab | sed -n -e ‘2,6!p’##显示除2和6行的

sed ‘s/1/8/g’ -i /mnt/fstab ##将/mnt/fstab的1换为8

d 模式操作 ##删除
sed ‘/^UUID/d’ /etc/fstab ##将UUID开头行删除
sed ‘/^#/d’ /etc/fstab ##将#开头行删除
sed ‘/^$/d’/etc/fstab ##将空行删除
sed ‘1,4d’/etc/fstab ##删除1到4行
sed –n ‘/^UUID/!d’ /etc/fstab ##删除除了UUID开头的行
cat -n fstab | sed ‘4d’ ##删除第四行
cat -n fstab | sed -e ‘4d;6d’ ##删除4和6行
cat -n fstab | sed -e ‘4,6d’ ##删除4到6行

a 模式操作 ##添加
sed ‘/UUID/ahello’ fstab ##在UUID后一行加hello
sed ‘/UUID/ahello\nworld’ fstab ##可以\n换行
i 模式操作
sed ‘/^UUID/i\hello’ ##在UUID前一行加hello

c 模式操作 ##替换
sed ‘/^UUID/c\hello sed\nwestos /etc/fstab’
sed ‘/^#/chello’ fstab ##将#开头的替换成hello
w 模式操作 ##写入
sed ‘/^UUID/w /tmp/fstab 4000 .txt’ /etc/fstab ##将UUID开头的写入/tmp/fstab.txt
sed -n’/^UUID/w /tmp/fstab.txt’ /etc/fstab ##不显示
sed ‘/^UUID/=’/etc/fstab ##UUID行号开头的行号
sed ‘6r /etc/issue’ /etc/fstab ##将/etc/issue写入/etc/fstab第六行

sed 的其他用法
sed -n ‘/^UUID/=’ fstab ##显示UUID开头的行的行号
sed -n ‘=’ fstab ##显示所有行行号
sed -n -e ‘/^UUID/p’ -e ‘/^UUID/=’ fsta ##显示UUID开头的行和行号
测试:
sed ‘=’ -i fstab ##在行的前一行加行号
sed ‘N;s/\n/ /g’ -i fstab ##将行号放在每一行前
N提前提取下一行内容模式空间

sed -e ‘s/brown/green/; s/dog/cat/’ data ##两个替换中间可以用;隔开
sed -f rulesfile file ##
sed ‘s/^//#/’/etc/fstab ##语句中有/时要用\转义
sed ‘s@^/@#@g’/etc/fstab ##可以使用@代替/,使语句中/更加明显不混淆
sed ‘s///#/’/etc/fstab
sed ‘s///#/g/’/etc/fstab

sed’G’ data ##给每行行后加一空行
sed’KaTeX parse error: Expected 'EOF', got '#' at position 11: !G' data #̲#除最后一行,给每行行后加一空…p’ data ##打印最后一行

awk 报告生成器

awk 处理机制 :awk 会逐行处理文本 , 支持在处理第一行之前做一些
准备工作 , 以及在处理完最后一行做一些总结性质的工作 , 在命令格式
上分别体现如下 :
BEGIN{}: 读入第一行文本之前执行 , 一般用来初始化操作
{}: 逐行处理 , 逐行读入文本执行相应的处理 , 是最常见的编辑指令

END{}: 处理完最后一行文本之后执行 , 一般用来输出处理结果

awk 基本用法

linux 上面默认使用 gawk
awk ‘{print FILENAME}’ passwd ##将文件名打印与行数相同遍
awk -F : ‘{print NR,NF}’ passwd ##NR行数,NF列数
awk ‘BEGIN{print “NAME”}’ ##开始,打印NAME
awk ‘END{print WESTOS}’ passwd ##结束,打印WESTOS
awk -F : ‘BEGIN{print NAME}{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 1}̲END{WESTOS}' ##…/’ 打印bash结尾
awk -F : ‘/bash$/{print $1}’ ##打印以bash结尾行的第一行

awk 的基本用法
awk’BEGIN{a=34;print a+12}’ ##awk进行数学运算
awk-F : ‘/^ro/{print}’ /etc/passwd ##
awk-F : ‘/1/{print $1,KaTeX parse error: Expected 'EOF', got '}' at position 2: 6}̲' passwd awk-F …/{print $1,$7}’ passwd
awk-F : ‘6 /bin6~/bin6 /bin/{print $1,$6}’
awk-F : ‘7! /nologin7!~/nologin7! /nologin/{print $1,$7}’ passwd

awk 测试
抓取 eth0 网卡的 ip
统计在系统中可以登陆系统的用户

find的基本用法

find
-name #根据名字查找
-maxdepth #最大路径深度
-mindepth #最小路径深度
例:
[root@localhost mnt]# find /etc/ -maxdepth 2 -name passwd
/etc/passwd
/etc/pam.d/passwd
[root@localhost mnt]# find /etc/ -maxdepth 1 -name passwd
/etc/passwd
[root@localhost mnt]# find /etc/ -mindepth 2 -name passwd
/etc/pam.d/passwd

-not	#不为
-user	#所有人
-group	#所有组
-a	#且
-o	#或

-size 20k	#大小为20k
-size -20k	##小于20k
-size +20k	#大于20k

-type		##查找类型,后面跟 l/d。。

-ctime 10	##修改天数为10的文件
-ctime -10 	##修改天数小于10的文件
-ctime +10 	##修改天数大于10的文件
-cmin +|-10	##修改时间大于|小于10分钟的文件

-perm  /444	##文件权限任意包含444的为文件,企业7之前用+,,或##==444是r--r--r--,所以文件内ugo任意一个有r权限,都可以找出来
-perm  444	##文件权限为444的文件
-perm	-444	##文件权限必须包含444的文件,且##==ugo里都必须包含r权限
  1. a-d ↩︎

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: