【shell脚本】shell脚本之sed高级应用、awk基本用法(shell脚本基础学习五)

恭喜你,找到宝藏博主了,这里会分享shell的学习整过程。

shell 对于运维来说是必备技能之一,它可以提高很多运维重复工作,提高效率。

shell的专栏,我会详细地讲解shell的基础和使用,以及一些比较常用的shell技巧。

有需要的可以从这里开始,可以教会你如何去进行shell脚本的编写,提高你的工作效率。
从第一篇基础开始:
【shell脚本】shell脚本之概念、运行方式、变量的使用、交互式脚本、运算(shell脚本基础学习一)_向往风的男子的博客-CSDN博客

sed高级应用--- awk基本用法 ---
sed 选项  (定址符)指令    处理的文件
前置指令 |  sed 选项  (定址符)指令
-n   -r   -i     p    d    s

cat nssw.txt

Hello th6e World
ni ha7o ma beijing

删除文件中每行的第二个、最后一个字符
sed 's/.//2;s/.$//' u

将文件中每行的第一个、倒数第1个字符互换
( )  保留(相当于复制)   \1 \2 相当于粘贴
sed -r 's/^(.)(.*)(.)$/\3\2\1/' u

删除文件中所有的数字
sed 's/[0-9]//g' u

为文件中每个大写字母添加括号
sed -r 's/([A-Z])/(\1)/g' u
----------------------------------------------------------------------
a在行下追加    i在行上添加    c替换整行

sed 'i XXXX' a        所有行上添加XXXX
sed '1i XXXX' a       第一行上添加XXXX
sed '1,2i XXXX' a     1~2行上添加
sed '1a XXXX' a       第一行下追加
sed 'c XXXX' a        所有行替换为XXXX
sed '1c XXXX' a       第一行替换
sed '/abc/c XXXX' a   有abc的行替换

-----------------------------------------------------------------------
编写脚本,找出使用bash的用户,按照 名字 --> 密码  的格式输出: 
#!/bin/bash
u=`sed -n '/bash$/s/:.*//p' /etc/passwd`    找到用bash的用户,并且把名字都存在变量u中
for i in $u   将变量u交给for循环处理
do
    x=`grep $i: /etc/shadow`   第一次循环,变量i是第一个用户
    a1=${x#*:}        掐头
    a2=${a1%%:*}    去尾
    echo "$i --> $a2"     输出
done

-------------------------------------------------------
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
However, this dress is about $ 3183 dollars.
GNU is free air not free beer.
Her hair is very beauty.
I can't finish the test.
Oh! The soup taste good.
motorcycle is cheap than car.
This window is clear.
the symbol '*' is represented as start.
Oh!    My god!
The gd software is a library for drafting programs.
You are the best is mean you are the no. 1.
The world  is the same with "glad".
I like dog.
google is the best tools for search keyword.
goooooogle yes!
go! go! Let's go.
# I am VBird
-----------------------------------------------
========================================
正则     
grep   模糊搜索
sed    可以修改文档
awk    精确搜索
------------------------------------------------
awk使用方式:
1 ,  awk 选项  (条件)指令   被处理的文件
2 ,    前置命令  |   awk 选项  (条件)指令  
选项:
-F 定义分隔符    
指令
print  输出
内置变量:
列  $0  $1  $2  $3 ...... NF列   NR行

awk '{print}' u
awk '{print $2}' u
awk '{print $0}' u
awk '{print $1}' u
awk '{print $1 $3}' u
awk '{print $1,$3}' u
awk '{print $0,$3}' u
awk '/beijing/{print}' u
----------------------------------------------------
cat user    准备素材
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
awk -F: '{print $6}' user  修改分隔符为冒号, 显示第6列
/root
/bin
awk -F: '/root/{print $6}' user   配合正则匹配有root的行,显示第6列
/root
awk -F/ '/root/{print $3}' user   修改分隔符,显示第3列
bin
awk -F[:/] '/root/{print $9}' user  使用冒号或者斜杠做分隔符,显示第9列
awk -F: '{print $1"的解释器是"$7}' user  输出常量,需要使用引号
awk -F: '{print $1 abc $7}' user    不加引号,系统会识别为变量,如果变量没有定义,则输出的值为空
awk -F: '{print $1 "abc" $7}' user  加引号,变常量输出
awk -F: '{print NR,NF}' user     输出行号和列号
----------------------------------------------------------------------------------------
ifconfig eth0 |awk '/TX p/{print "当前主机eth0网卡的发送流量是"$5"字节"}'
ifconfig eth0 |awk '/RX p/{print "当前主机eth0网卡的接收流量是"$5"字节"}'
df -h | awk '/vda1/{print "主机根分区剩余空间是"$4}'
----------------------------------------------------------------------------------------
使用awk,筛选出远程登录本机密码输入失败的主机ip:
awk '/Failed/{print $11}' /var/log/secure
----------------------------------------------------------------------------------------
awk的工作流程控制
BEGIN任务    执行1次
逐行任务       执行N次
END任务        执行1次
----------------------------------
awk 'BEGIN{x=10;print x}'    仅仅使用begin任务,执行1次
----------------------------------
awk 'BEGIN{print "x"}{print "A"}' user   执行1次begin任务,然后在执行逐行任务,逐行任务的执行次数与user文本的行数有关
----------------------------------
awk 'BEGIN{print "x"}{print "A"}END{print "Q"}' user   分别给begin,逐行,end 三个任务
----------------------------------------------------------------------------------------
\t  制表符  相当于tab键, 可以起到一定的排版效果
------------------------------------
awk -F: 'BEGIN{print "User\tUID\tHome"}{print $1"\t"$3"\t"$6}END{print "总计 "NR" 行"}' user 
==============================================
awk的条件
1,使用正则匹配
    ~   包含
awk '/bin/' user          输出含有bin的行
awk -F: '$1~/bin/' user   输出第一列包含bin的行
awk -F: '$1!~/bin/' user    输出第1列不包含bin的行
awk -F: '$1!~/^(bin|root)/' user   输出第1列不包含以bin或者root开头的行
-----------------------------------------
2,使用数值/字符串比较设置条件
==(等于)    !=(不等于) >(大于)
>=(大于等于) <(小于) <=(小于等于)
awk 'NR==2{print}' user   输出第2行内容
awk -F: '$1=="root"' user    输出第1列是root的行
awk -F: '$1!="root"' user    输出第1列不是root的行
awk -F: '$3=="0"' user       输出第3列是0的行
awk -F: '$3<10' /etc/passwd   输出第3列小于10的行
awk -F: 'NR<10' /etc/passwd   输出小于10行的内容,相当于输出1~9行
awk -F: '$3>=1000' /etc/passwd   输出第3列大于等于1000的行
--------------------------------------------
3,使用逻辑符号     &&并且       ||或者
---------------------------------------------
4,计算
awk 'BEGIN{x++;print x}'   
awk 'BEGIN{print 2*3}'     
awk 'BEGIN{a=10;b=20;print a*b}'
awk 'BEGIN{print 23%8}'
seq 200 | awk '$1%33==0'

你可能感兴趣的:(shell学习,linux,运维,服务器)