1,grep:全面搜索研究正则表达式并显示出来 • grep 命令是一种强大的文本搜索工具 , 根据用户指定的“模 式”对目标文本进行匹配检查 , 打印匹配到的行,由正则表达式或者字符及基本文本字符所编写的过滤条件
grep (过滤)全面搜索研究正则表达式并显示出来
grep root passwd 将所有含有root的行显示出来
gerp ^root passwd 将以root开头的行显示出来
grep root$ passwd 将以root结尾的行显示出来
grep -i ^root passwd 忽略大小写将以root开头的行显示出来
grep -i root$ passwd
grep -i -E "^root|root$" passwd 把root开头或者结尾的都显示出来
-v 表示将符合条件的隐藏,反向
-E 扩展正则表达式,识别|或者的意思
grep 中字符的匹配位置设定
^关键字 以关键字为开头的都输出
关键字$ 以关键字为结尾的都输出
\<关键字
关键字>
\<关键字>
'r...t'匹配rt中间三个字符的
'r...' 匹配r后面三个字符的,满足条件包含其他字符的也显示
'r...\>'匹配r后面只有三个字符的
'...t'匹配t前面三个字符的
grep中字符的匹配次数设定
* 字符出现0-任意次
\? 字符出现0-1次
\+ 字符出现1-任意次
{n\} 字符出现n次 前面的\表示转义,相当于-E
{m,n\} 字符最少出现n次,最多出现m次 \表示防止做扩展搜索,做精确搜索
{0,n\} 字符出现0-n次
{m,\} 字符至少出现m次
{(xy\){n\} xy 关键字出现n次
*关键字之间匹配任意字符
试验
vim test
root
rt
rooooot
rooot
roooooot
rootrroot
rotroot
~
grep 'r..t' test
grep -E 'ro*t' test
grep -E 'ro?t' test
grep -E 'ro+t' test
grep -E 'ro{1,3}t' test
grep -E 'root' test
grep -E '(root){2,}' test root关键字出现两次的显示出来
grep -E "r..." test 将所有满足r后面存在5个字符以上的都输出
grep -E "r...\>" test 将r后面五个字符的输出,多余的屏蔽
grep -E "...t" test
grep -E "\<...t" 将t前面只有3个字符的输出
脚本:将系统能够登陆的用户显示出来
2.行编辑器sed
tream editor
用来操作纯 ASCII 码的文本
处理时 , 把当 前处理的行存储在临时缓冲区中 , 称为“模式空
间” (pattern space) 可以指定仅仅处理哪些行
sed 符合模式条件的处理 不符合条件的不予处理
处理完成之后把缓冲区的内容送往屏幕
接着处理下一行 , 这样不断重复 , 直到文件末尾
sed对字符的处理
p 显示
d 删除
a 添加
c 替换
w 写入
i 插入
p 显示模式
sed -n '/^#/p' fstab 显示以#开头的行
sed -n '/^#/!p' fstab 显示不以#开头的行
sed -n '/bash$/p' passwd
sed -n '/bash$/p' passwd > file 将信息显示到file文件
cat -n fstab | sed -n '2p;6p' 显示第二行和第六行
cat -n fstab | sed -n '2,6p' 显示2-6行
cat -n fstab | sed -n '2!p;6!p'| uniq -d 不显示2和6行(两个条件之间也可以以-e连接)
d 删除模式
cat -n fstab | sed -e '2d;6d' 删除2和6行
cat -n fstab | sed -e '2,6d' 删除2-6行
sed -e '/^#/d' fstab 删除以#开头的行
sed -e '/^$/d' fstab 删除空行
sed -e '/^#/d;/^$/d' fstab 删除空行和以#开头的行
sed '/^UUID/!d' fstab 删除UUID开头行并显示内容
a 添加模式
sed '/hello/aworld' westos 添加一行
sed '/hello/aworld\nwestos' westos 添加多行
i 插入模式
sed '/^UUID/i\hello sed\nwestos' fstab
c 更改模式
sed '/hello/chello world' westos
sed '/hello/chello\nworld' westos
w 写入模式
sed -n '/bash$/wfile' passwd 将passwd里以bash结尾的信息写入指定文件
sed -n '/hello/wfile' westos 将文件的信息写入指定文件
cat file
sed -n '/hello/p' westos >file 将文件的信息显示到指定文件
cat file
sed的w功能 一个程序 处理以行存一行 更高效
>file 输出到指定文件是两个程序 处理完之后存入
sed '6r westos' fstab 将westos的信息写入fstab文件的第六行
sed '$r westos' fstab 将westos的信息写入fstab文件的最后一行
= 加入行号
i 将输出的结果指定输出到文件
6r 将文件写入第六行后
$r 将文件内容写入末行
r 将文件内容写入每一行
?首行
sed -n '/^UUID/=' fstab 显示文件行数,只输出结果
sed '/^UUID/=' fstab 显示行数,并输出内容
sed -n -e '/^UUID/p' fstab
sed -n -e '/^UUID/p' -ne '/^UUID/=' fstab
-n输出一词
不加输出两次结果和内容
=等于加入行号
替换模式
sed 's/nologin/westos/g' passwd 将passwd中的nologin 全部替换为westos
sed '3,5s/nologin/westos/g' passwd 将passwd文件中3-5行的nologin替换为westos
sed '1,5s/nologin/westos/g' passwd将前五行文件的nologin替换为westos
sed '/adm/,/sync/s/nologin/westos/g' passwd 将关键字范围的nologin替换为iwestos
sed -e '/adm/,/sync/s/nologin/westos/g;s/sbin/linux/g' passwd同时替换nologin和sbin
vim file
编辑
s/nologin/westos/g
s/sbin/linux退出保存
sed -f file passwd 将passwd使用file的替换规则进行替换
sed -f file -i passwd 在原文件上直接替换,改变文件
脚本1:
(1) 创建用户脚本
vim creat_user.sh
#!/bin/bash
vim creat_user.sh
MAX_LINE=`wc -l $1|cut -d " " -f 1`
for LINE_NUM in `seq 1 $MAX_LINE`
do
USERNAME=`sed -n "${LINE_NUM}p" $1`
PASSWORD=`sed -n "${LINE_NUM}p" $2`
useradd $USERNAME
echo $PASSWORD | passwd --stdin $USERNAME
done
测试:执行脚本
vim userfile
user1
user2
user3
vim passwdfile
user1123
user2123
user3123
sh creat_user.sh userfile passwdfile 将指定密码规定到指定用户
脚本2
自动安装http并且改变为指定端口
vim install_apache.sh
编辑:
#!/bin/bash
yum install httpd.x86_64 -y &> /dev/null
systemctl start httpd
sed -i "/^Listen/cListen $1" /etc/httpd/conf/httpd.conf
echo the listen is changed;
sed -ne '42p' /etc/httpd/conf/httpd.conf
systemctl restart httpd
测试:
sh install_apache.sh 93
netstat -antlupe | grep 93
脚本3
输出系统可以登陆的用户
vim nologin_user.sh
#!/bin/bash
SHELL=$(echo `grep -v nologin /etc/shells`|sed 's/ /|/g')
grep -E "$SHELL" /etc/passwd | cut -d : -f 1
测试:
sh nologin_user.sh 显示用户
useradd -s /bin/tcsh user1
chmod +x nologin_user.sh 可以不使用sh命令
su - user1登陆成功
sh nologin_user.sh显示user1
脚本4
输出可以登陆系统的用户个数
awk -F “:” ‘BEGIN{N=0}/bash$/{N++}END{print N}’ passwd
三、awk
awk 处理机制 :awk 会逐行处理文本 , 支持在处理第一行之前做一些
准备工作 , 以及在处理完最后一行做一些总结性质的工作 , 在命令格式
上分别体现如下 :
BEGIN{}: 读入第一行文本之前执行 , 一般用来初始化操作
{}: 逐行处理 , 逐行读入文本执行相应的处理 , 是最常见的编辑指令
快
END{}: 处理完最后一行文本之后执行 , 一般用来输出处理结果
基本命令
awk -F(动作) ‘/bash
1}’ passwd 将以bash结尾的第一个字符显示
awk -F “:” ‘BEGIN{print “NAME”}{print NR;print }END{print “END”}’ passwd
0表示整行
1表示第一列
wk -F ":" '{print NR,$0}' passwd 输出整个文件的所有内容
awk -F ":" '$1!~/^r/{print}' passwd 输出第一列不是r开头的所有内容
输出可以登陆系统但是家目录不是home的用户
awk -F ":" '$6!~/\/home/&&/bash$/{print $1}' /etc/passwd
useradd -d /mnt/home hello1
输出eth0网卡的ip
ifconfig eth0 | awk -F " " '/inet /{print $2}'
ifconfig eth0 | awk -F " " '/inet\>/{print $2}'
显示文件的行数END
awk 'BEGIN{n=0}{n++}END{print n}' /etc/passwd