基于linux下的shell的文本处理

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 不显示26行(两个条件之间也可以以-e连接)

这里写图片描述

这里写图片描述

 d 删除模式
    cat -n fstab | sed -e '2d;6d'            删除26行
    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 /{printf 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 

这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/ningyuxuan123/article/details/80766464