1.grep [Globally search a Regular Expression and Print]
grep -E = egrep

grep 格式
grep                      匹配条件 处理文件
grep root passwd          ##过滤root关键字
grep -i root passwd       ##后略大小写
grep -E "<root" passwd   ##root字符之前不能有字符
grep -E "root>" passwd   ##root字符之后不能有字符
grep -数字    ##显示过滤行以及上面几行和下面几行
grep -n       ##显示匹配的行所在行号
grep -A       ##显示过滤行以及下面几行
grep -B       ##显示过滤行以及上面几行
grep -v       ##反向过滤
grep root /etc/passwd      ##含有root的行

grep -E “root|nologin” /etc/passwd      ##含有root和nologin的行

grep -e root -e bash /etc/passwd          ##含有root和bash的行

grep -i root /etc/passwd         ##忽略大小写查找含root的行

grep -E “<root>” /etc/passwd      ##root前后都不能有字符的行

grep -5 halt /etc/passwd            ##显示含有关键字的前后各5行 

grep -B5 halt /etc/passwd                ##含有关键字的前5行

grep -A5 halt /etc/passwd         ##含有关键字的后5行

grep root /etc/passwd -v           ##反选,不含有关键字的行


grep字符数量匹配规则
^westos     ##以westos开有
westos$     ##以westos结尾
w....s      ##w开头s结尾中间4个任意字符
.....s      ##s结尾前面5个任意字符
*           ##字符出现任意
?           ##0到1次
+           ##1次到任意次
{n}         ##n次
{m,n}       ##m到n次
{0,n}       ##0-n次
{,n}        ##0-n次
{m,}        ##最少m次
(lee){2}    ##lee字符串出现2次

grep w.s text          ##ws之间一个字符

grep w..s text         ##ws之间两个字符 

grep w…s text       ##ws之间三个字符

grep -E “w.{2}s” text      ##ws之间两个字符

grep -E “w.*s” text       ##ws之间任意个字符

grep -E “wa*s” text            ##ws之间任意个a

grep -E “wa{1}s” text            ##ws之间1个a

grep -E “wa?s” text            ##ws之间任意个a

grep -E “wa+s” text         ##ws之间1-任意个a 

grep -E “wa{1,}s” text       ##ws之间1-任意个a

grep -E “wa{1,2}s” text       ##ws之间1-2个a

grep -E “w(ab){2,}s” text       ##ws之间2-任意个ab


练习脚本:
请显示系统中能被su命令切换的用户名称

grep -E "bash$|sh$" /etc/passwd | cut -d: -f 1

 2.sed 
命令格式:
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件

对字符的处理
p     ##显示
sed -n 5p westos       ##显示第五行
sed -n 3,5p westos     ##显示3到5行
sed -ne '3p;5p' westos ##显示3和5行
sed -ne 1,5p westos    ##1-5行
sed -ne '5,$p' westos  ##5到最后以行
sed -n '/^#/p' /etc/fstab     ##显示以#开头的行


d     ##删除
sed 5d westos         ##删除第五行
sed '/^#/d' fstab     ##把#开头的行删除
sed '/^UUID/!d' fstab ##除了UUID以外的行都删除
sed -e '5,$d' westos

 


a   ##添加
sed -e '$a hello world' fstab
sed -e '$a hellonworld' fstab
sed -e '/^#/a hello world' fstabc

 


c    ##替换
sed -e '/^#/c hello world' fstab
sed '5chello world' westos


w     ##把符合的行写到指定文件中
sed '/^UUID/w text' westos    ##把westos中UUID开头的行写入text中
sed '/nologin$/w text' /etc/passwd ##将passwd中的以nologin结尾的写入text中

 


i    ##插入
sed '5ihello westos' westos
sed '/westos/i westoslinux' westos  在westos中的westos前面插入westoslinux
sed '/westos/a westoslinux' westos  在westos中的westos后面插入westoslinux

r     ##整合文件
sed '5r ansible' westos   将ansible中的内容整合到第5行的下面


sed 字符替换
sed 's/:/###/g' westos
sed 's/:/###/' westos
sed 's/:/###/g' westos
sed '1,5s/:/###/g' westos
sed '1s/:/###/g' westos
sed '1s/:/###/g;5s/:/###/g' westos
sed '/lp/,/shutdown/s/:/###/g' westos
sed 's///####/g' westos
sed 's@/@####@g' westos
sed 's@/@####@g' -i westos
把sed处理的内容保存到westos文件中

 


练习及脚本
Apache_port.sh
此脚本接入数字
http的端口就改为此数字
假设selinux为关闭状态
例如:
sh Apache_port.sh
ERROR: Pleaase input port number following script !!
sh Apache_port.sh 8080
apache的端口会被修改为8080

#!/bin/bash
setenforce 0 &amp;&gt; /dev/null

        [ -z "$1" ] &amp;&amp; {
                echo "Error:PLease input port number!!!"
                exit
        }

        rpm -q httpd &amp;&gt; /dev/null || {
                echo "Error: Apache is not running!"
                exit
        }

        systemctl status httpd | grep "running" &amp;&gt; /dev/null || {
                echo "Error : Apache is not running!!"
                exit
        }

        netstat -antlupe | grep -E ":$1&gt;" &amp;&gt; /dev/null &amp;&amp;{
                echo "Error:$1 is in used!"
                exit
        }


        sed "/^Listen/c Listen $1" -i /etc/httpd/conf/httpd.conf
        systemctl restart httpd


3.awk
awk -F 分隔符 BEGIN{}{}END{} FILENAME
NR     ##行数
NF     ##列数
FILENAME    ##文件名称本身
westos      ##westos变量值
“westos”    ##westos字符串

/bash$/    ##条件
/条件1|条件2/        ##条件1或者条件2
/条件1/||/条件2/     ##条件1或者条件2
/条件1/&amp;&amp;/条件2/     ##条件1并且条件2
$0         ##所有的列
$1         ##第一列
$2         ##第二列
$3         ##第三列

awk -F : ‘$6!~/home/&&/bash$/{print}’ /etc/passwd     ##/etc/passwd文件的第六列没有home关键字并且以bash结尾的行

awk -F: ‘{print NR}’ passwd             ##打印行数

awk -F: ‘{print NF}’ passwd             ##打印列数 awk -F: ‘{print FILENAME}’ passwd            ##打印文件名 awk -F: ‘/nologin$/{print $1,$7}’ /etc/passwd    ##打印一nologin结尾的所有的行 awk -F: ‘/nologin$|^root/{print $1,$7}’ passwd       ##两个条件或的关系

awk -F: ‘/bash$/&&/^root/{print $1,$7}’ /etc/passwd           ##两个条件且的关系 

awk -F: ‘$7~/bash$/{print $0}’ /etc/passwd         ##第七列以bash结尾的打印 

awk -F: ‘$7!~/bash$/{print $0}’ /etc/passwd         ##第七列不是bash结尾的打印 


课后练习:

统计在系统中能su切换的并且用户加目录不在/home下的用户数量

awk -F: 'BEGIN{N=0}$6!~//home/&amp;&amp;/bash$|sh$/{N++}END{print N}' /etc/passwd

 


云野 » Linux中的文件处理工具

发表回复