一、文本处理命令——awk报告生成器(grep和sed在上篇文章中有说明)
1.awk 处理机制 :
awk 会逐行处理文本 , 支持在处理第一行之前做一些准备工作 , 以及在处理完最后一行做一些总结性质的工作 , 在命令格式分别体现如下 :
BEGIN{ }: 读入第一行文本之前执行 , 一般用来初始化操作
{ }: 逐行处理 , 逐行读入文本执行相应的处理 , 是最常见的编辑指令
END{ }: 处理完最后一行文本之后执行 , 一般用来输出处理结果
2.awk基本用法:
awk -F : '{print $1}' passwd ##以:为分隔符,显示passwd的第一列(不指定分隔符时默认为空格)
awk -F : '{print $0}' passwd ##以:为分隔符,显示passwd所有内容(awk中$0表示所有内容)
awk -F : 'BEGIN{print "hello"}{print $1}' passwd
#以:为分隔符,显示passwd的第一列,并在处理文件之前显示hello
awk -F : 'BEGIN{print "hello"}{print $1}END{print "byebye"}' passwd
#以:为分隔符,显示passwd的第一列,并在开头显示hello,结尾显示byebye
awk -F : 'BEGIN{n=1}{print n++,$1}' passwd
#以:为分隔符,显示passwd的第一列,并从1开始显示行号
awk -F : 'BEGIN{n=1}{print n++,$1}END{print NR}' passwd
#以:为分隔符,显示passwd的第一列,并从1开始显示行号,并在结尾输出总行数
awk -F : 'BEGIN{n=1}{print n++,$1}END{print NF}' passwd
#以:为分隔符,显示passwd的第一列,并从1开始显示行号,并在结尾输出总列数
awk -F : 'NR==1{print $1}' passwd ##以:为分隔符,显示passwd的第一行第一列
awk -F : 'NR==1{print}' passwd ##以:为分隔符,显示passwd的第一行所有内容
awk -F : 'NR>=1&&NR<=3{print}' passwd ##以:为分隔符,显示passwd第一行到第三行的所有内容
awk -F : 'NR==1||NR==3{print}' passwd ##以:为分隔符,显示passwd第一行和第三行的内容
awk -F : '/bash/{print}' passwd ##显示passwd含有bash的行
awk -F : '/bash/{print $1}' passwd ##以:为分隔符,显示passwd含有bash行的第一列
awk -F : '/bash$/{print}' passwd ##显示passwd中以bash结尾的行
awk 'BEGIN{A=34;print A+12}' ##显示34+12的结果(简单的四则运算)
awk 'BEGIN{A=34;print A-12}' ##显示34-12的结果
awk 'BEGIN{A=34;print A*2}' ##显示34*2的结果
awk 'BEGIN{A=34;print A/2}' ##显示34/2的结果
awk -F : '/^root/{print}' /etc/passwd
#以:为分隔符,显示出以root开头的行
awk '/^[a-d]/{print}' /etc/passwd
#显示以a,b,c,d开头的行
awk '/^[^a-d]/{print}' /etc/passwd
#显示除了a-d开头的行
awk '/^r|bash$/{print}' /etc/passwd
#显示以r开头或者以bash结尾的行 或者 awk '/^r/||/bash$/{print}' /etc/passwd
awk -F : '$6~/bin$/{print $1 $6}' passwd
#以:为分隔符,显示第六列以bin结尾的行的第一列和第六列
awk -F : '$7!~/nologin$/{print $1,$7}' passwd
#以:为分隔符,显示除了第七列是以nologin结尾的行的第一列和第七列
二、shell 脚本中的基本知识
1.给shell脚本自动添加表头的设置
vim /etc/vimrc ##修改配置文件,在使用vim编写脚本时使其可以自动执行
#map <F9> ms:call WESTOS()<cr>'s ##进入文件后按<F9>快捷键添加,当设置自动添加时,注释此行使命令不生效
autocmd BufNewFile *.sh exec ":call WESTOS()" ##只要是创建以.sh结尾的文件都会自动调用函数WESTOS添加表头
function WESTOS() ##添加一个函数WESTOS
call append(0,"##############################")
call append(1,"# Author: #")
call append(2,"# Create_Time: ".strftime("%Y-%m-%d")." #")
call append(3,"# Version: #")
call append(4,"# Mail: #")
call append(5,"# Description: #")
call append(6,"# #")
call append(7,"# #")
call append(8,"#############################")
call append(9,"")
call append(10,"#!/bin/bash")
endfunction ##函数结束
2.脚本调试:
sh -x ip.sh ##查看输出及执行过程
#脚本执行的几种方式:
#ps -f ##查看脚本运行的从属关系
sh /mnt/ip.sh #直接执行脚本,在子shell中执行
chmod +x /mnt/ip.sh #给脚本执行权限,以绝对路径文件名称直接运行脚本
/mnt/ip.sh #在子shell中执行
#直接在当前shell执行脚本命令
source aa.sh
. aa.sh
3.脚本中的变量
(1)什么是变量?
##变量即在程序运行过程中它的值是允许改变的量,变量是用一串固定的字符来表示不固定的值的一种方法,变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储 Script 运行时可以被更改的程序信息
##在 shell 中变量是不能永久保存在系统中的,必须在文件中声明才可以长久保存
(2)变量的种类:
##在 shell 中变量分为环境级变量,用户级变量,系统级变量
环境级变量:只在当前 shell 中生效, shell 关闭后变量丢失
用户级变量:写在用户的骨文件中,只针对当前用户生效
系统级变量:被写在系统的配置文件 /etc/profile 或者 /etc/profile.d/ 中,对于所有用户都生效
(3)变量定义的方法:
#env 显示环境中所有变量
export a=1 ##环境级变量,退出当前环境后设定失效
vim ~/.bashrc ##用户级变量,只对当前用户生效
vim /etc/profile ##系统级,全局的,对于所有用户都生效,/etc/bashrc
##系统级和用户级定义同一个变量时,先读取系统级设定,后读取用户级设定,所以最终显示的是用户级设定变量
#环境级设置:
#用户级设置:
#系统级设置:
(4)变量名称的规范书写:
#变量名称中通常包含大小写字字母,数字,下划线(不是必须的),常见的变量书写格式如下:
变量名称格式
WESTOS_LINUX
Westos_Linux
westoS_Linux
(5)字符的转译及变量的声明
所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,一般需要转译成普通字符使用
\ ##转译单个字符
"" ##弱引用,不能引用! \ $ `
'' ##强引用,可以引用所有字符串
${} ##变量声明
(6)变量值传递:
$0 ##文件的绝对路径及文件名称
$1 ##脚本后的第一串字符
$2 ##脚本后的第二串字符
$3 ##脚本后的第三串字符
$# ##脚本后所根字符串个数
$* ##脚本后跟的所有字符串,模式为“1 2 3”,只有一个输出
$@ ##脚本后跟的所有字符串,模式为“1”“2”“3”,相同输入会有好几个输出
$$ ##显示正在运行脚本的PID
(7)用read实现变量传递(交互式脚本)
read -p "你瞅啥:" -s TARGET ##-p脚本执行会看到这个交互语言,-s加密让交互的输入不可见
echo $TARGET
(8)命令别名的设定(与之前的变量定义大致相同,此处不再赘述):
alias xie='vim' ##当前环境中生效,退出后失效,xie与vim效果相同
unalias xie='vim' ##取消命令别名设置
vim ~/.bashrc ##当前用户生效,切换用户后失效,xie与vim相同
source ~/.bashrc ##读取文件设定
vim /etc/bashrc ##系统级生效,切换用户不加-时也生效
##/etc/profile,加-读取环境设定时才会生效
(9)利用命令执行结果设定变量
$? 是命令在执行完成之后产生的退出值,范围是 [0-255],这里列举几个常用的参数:
0 命令成功结束
1 通用未知错误
2 误用shell命令
126 命令不可执行
127 没找到命令
128 无效退出参
当 $?=0 时表示命令执行没有错误输出
而且这个值可以用 exit 命令执行 .
例如 exit 66
(10)脚本中的函数:
脚本中的函数时把一个复杂的语句块定义成一个字符串的方法
#!/bin/bash
ACTION()
{
read -p "please input a word: " WORD
[ "$WORD" = "exit" -o "$WORD" = "EXIT" ]&& {
echo bye
exit 0
}||{
echo $WORD
}
ACTION
}
ACTION ##ACTION就是上面一段程序的函数,在当前脚本中使用这个字符串就是使用这段程序