shell脚本

date命令
功能:date可以用来显示或设定系统的日期和时间。
%n:下一行(即a newline)
%t:跳格(即一个tab)
%H:小时(00-23)
%I(大写i):小时(01-12)
%k:小时(0-23)
%l(大写L):小时(1-12)
%M:分钟(00-59)
%p:显示本地AM或PM
%r:直接显示时间(12小时制,格式是hh:mm:ss[AP]M)
%s:从1970年1月1日00:00:00UTC到目前为止的秒数
%S:秒(00-60)
%T:之间显示时间(24小时制)
%X:相当于 %H:%M:%S
%Z:显示时间
%a:星期几(Sun-Sat)
%A:星期几(Sunday-Saturday)
%b:月份(jan-Dec)
%B:月份(janusry-Decemaber)
%c:直接显示日期与时间
%d:日(01-31)
%D:直接显示日期(mm/dd/yy)
%h:同%b
%j:一年中的第几天(001-366)
%m:月份(01-12)
%U:一年中的第几周(00-53)(以Sunday为一周的第一天的情形)
%w:一周中的第几天(0-6)
%W:一年中的第几周(00-53)(以Monday为一周的第一天的情形)
%x:直接显示日期(mm/dd/yy)
%y:年份的最后两位数字(00.99)
%Y:完整年份(0000-9999)
%Y表示年,%m表示月,%d表示日,%H表示小时,%M表示分钟,%S表示秒,%s表示从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数, %w表示一周中的第几天

/root/test.sh 或 ./test.sh (当前路径下执行脚本,文件要有执行权限的)
source script-name或 . script-name
ource或者“.”命令的功能是:读入脚本并执行脚本,即在当前Shell中执行source或“.”加载并执行的相关脚本文件的命令及语句,而不是产生一个子Shell来执行文件中的命令

标准输入(STDIN):默认的设备是键盘,文件编号为0,命令将从标准输入中读取在执行过程中需要的输入数据。例如通过passwd设置用户密码操作
标准输出(STDOUT):默认的设备是显示器,文件编号为1,命令将执行后的输出结果发送到显示器。
标准错误(STDERR):默认的设备是显示器,文件编号为2,命令将执行期间的各种错误信息发送到显示器。

变量的解释:
变量是shell 传递数据的一种方法。变量是用来代表每个值的符号名。我们可以把变量当成一个容器,脚本可以在内存中存储数据,然后通过变量。就可以在脚本执行中进行修改和访问存储的数据

变量的设置规则:
1、变量名称通常是大写字母,它可以由数字、字母(大小写)和下划线_组成。变量名区分大小写;但是大家要注意变量名称不能以数字开头
2、等号 = 用于为变量分配值,在使用过程中等号两边不能有空格
3、变量存储的数据类型是整数值和字符串值
4、在对变量赋于字符串值时,建议大家用引号将其括起来,需要使用单引号或双引号。
5、要对变量进行调用,可以在变量名称前加美元符号$
6、如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“ 变 量 名 ” 或 用 变量名”或用 {变量名}

变量的分类
1、用户自定义变量
2、环境变量:这种变量中主要保存的是和系统操作环境相关的数据,例如PATH环境变量。
3、位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
4、预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

变量格式:
变量名,由字母或下划线打头,不允许数字开头,后面由字母、数字或下划线组成,并且大小写字母意义不同。
变量赋值,在“=”后边直接指定变量内容是为变量赋值的最基本方法,注意,“=”两边没有空格。

环境变量:在bash shell中,环境变量分为两类(全局变量 局部变量)
全局变量:对于shell和所有的子shell都是有效的
局部变量:它只在当前的shell环境中有效,当进入子程序或新的子shell环境时,局部变量将无法再使用。

变量永久生效,可以把定义好的变量写入配置文件
我们登录系统时,不同的用户会启用不同的配置文件,一般情况下有以下几个:
/etc/profile 是shell的主启动文件,只要你登录,bash会就执行这个文件,针对所有用户都生效。
$HOME/.bash_profile 作用和上面一样的,它是用户的专属配置文件
例如:
[root@localhost ~]# vim /etc/profile
配置文件生效的二种方式:
1.退出当前用户,重新进入
2.执行source命令
[root@localhost ~]# source /etc/bash_profile

位置变量
Shell解释执行用户的命令时,将命令行的第一个字作为命令名,而其它字作为参数。由出现在命令行上的位置确定的参数称为位置参数。
使用$N 来表示
$0 获取当前执行shell脚本或程序的名称,包括脚本路径,命令本身。注意:$0属于预定义变量而不是位置变量。
n 获 取 当 前 脚 本 的 第 n 个 参 数 n = 1 , 2..... n 当 n 大 于 9 时 用 n 获取当前脚本的第n个参数 n=1,2.....n 当n大于9时 用 nnn=1,2.....nn9{10}表示。

预定义变量
有些变量是一开始执行Script脚本时就会设定,且不能被修改,我们叫他们为预定义变量。这些变量当一执行程序时就有了,以下是一些预定义变量:

$*:表示所有位置参数的内容,即以一个字符串显示所有向脚本传递的参数;
$*以"$1 $2 … $n"的形式输出所有参数

$#:表示命令行中位置参数的个数,传递到脚本的参数个数

@ : 与 @:与 @*相同$@以"$1" “ 2 " … " 2" … " 2""n” 的形式输出所有参数

$?:显示上一条命令的退出状态;0表示没有错误,其他任何值表明有错误
$!:后台运行的最后一个进程的进程号pid

$* 与 KaTeX parse error: Unexpected character: '' at position 147: …与管道操作 1,重定向操作 ̲ 标准输入(stdin):默认…” /etc/passwd 提取以bash结尾的文件
Grep “/bin/bash$” /etc/passwd | awk -F : ‘{print $1,KaTeX parse error: Expected 'EOF', got '}' at position 2: 7}̲’ 提取以bash结尾的文件的…。可以引用一个变量值。使用echo可以查看变量。
举例:echo $product
Echo $product $version
注意:当前变量名称容易和紧跟其后的其他字符想混淆时,需要添加{}将其括起来
举例:echo $product2.5
Echo ${product}2.5
3)变量赋值的特殊操作
 双引号(“”)
 双引号主要起界定字符串作用,当赋值的内容中有空格的时候,必须以双引号括起来。
举例:Python=“Python 2.7.12”
Echo $Python
同样,也可以引用其他变量值。
举例:sqlserver=“sqlserver $python” 以变量的值进行赋值
Echo KaTeX parse error: Unexpected character: '' at position 13: sqlserver e ̲ 单引号(‘’) 当要赋值的内… 、/等特殊符号时,使用单引号括起来。
注意,在单引号范围内,将无法引用其他变量的值。
 反撇号(``)
反撇号主要用于命令的替换,允许将执行某个命令的屏幕输出结果赋值到变量。反撇号括起来范围内必须是能够执行的命令行。
举例:ls -lh which useradd
Rpm -qc $(rpm -qf $(which useradd)) 查询useradd命令程序的软件所安
装的配置文件位置。
软件所安装的配置文件位置
 Read 命令
Read 命令用来提示用户输入信息,从而现实简单的交互过程。
举例:执行以下操作将会等待用户输入文件,并输入的内容赋值给变量
Dir
Read dir1
/opt/backup
Echo $read
/opt/backup
结合“-p”选项来设置提示信息,以便告知用户应该输入什么内容等。
举例:若希望提示用户输入备份文件的存放目录,并将输入的路径信息赋值给变量dir2
Read -p “请指定备份存放目录:” dir2
Echo KaTeX parse error: Unexpected character: '' at position 6: dir2 ̲ 设置变量的作用范围 默认情况…product v e r s i o n ” 查 看 当 前 定 义 的 变 量 值 E c h o p r o d u c t v e r s i o n 将 p r o d u c t v e r s i o n 设 置 全 局 变 量 B a s h 进 入 子 s h e l l 环 境 E c h o “ version” 查看当前定义的变量值 Echo product version 将product version 设置全局变量 Bash 进入子shell环境 Echo “ versionEchoproductversionproductversionBashshellEchoproduct $version” 可以调用父shell的全局变量
 数字变量的运算
在shell环境中,只能进行简单的整数运算,不支持小数运算。整数运算的运算只要通过内部命令expr进行。
1,+ 加法运算
2,- 减法运算
3,* 乘法运算
4,/ 除法运算
5,% 取余运算

2,特殊的shell变量
A,环境变量
环境变量指的是出于运算需要而由linux系统提前创建的一类变量,主要用于设置用户的工作环境,包括宿主目录、命令查找路径、用户当前目录等。使用env命令可以查看当前工作环境下的环境变量。
B,位置变量
位置变量也称为位置参数,使用$1,$2,$3-$9表示。
举例:编写一个加法运算的小脚本adder.sh,用来计算两个整数的和
Vi adder.sh
#!bin/bash
sum=``expr $1 + $2echo “$1 + $2 = $sum” ./adder.sh 12 13 ./adder.sh 23 34 C.预定义变量 预定义变量使用“$”符号和另一个符号组合表示,  $# 表示命令行中位置参数的个数  $* 表示所有位置参数的内容  $? 表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。  $0: 表示当前执行的脚本或程序的名称 条件测试操作 Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0时表示成功,否则表示失败或异常。使用专门的测试工具-test命令,可以对特定条件进行测试。并根据返回值来判断条件是否成立(返回值为0表示条件成立)。 1.文件测试 文件测试指的是根据给定的路径名称、判断对应的是文件还是目录,或者判断文件是否可读、可写、可执行等。  -d 测试是否为目录  -e 测试目录或文件是否存现  -f 测试是否为文件  -r 测试当前用户是否有权限读取  -w 测试当前用户是否有权限写入  -x 测试是否设置有可执行 整数值比较 整数值比较指的是根据给定的两个数值,判断第一个数与第二个数的关系。  -eq 第一个数等于第二个数  -ne 第一个数不等于第二个数  -gt 第一个数大于第二个数  -lt 第一个数小于第二个数  -le 第一个数小于或等于第二个数  -ge 第一个数大于或等于第二个数 判断当前已登录的用户,当超过两个时,输出“too many”. unum=who | wc -l`
[ $unum -gt 2 ] && echo “too many”

字符串的比较
字符串比较通常用来检查用户输入、系统环境的是否满足条件。
 = 第一个字符串与第二个字符串相同
 != 第一个字符串与第二个字符串不相同,其中!符号表示相反
 -z 检查字符串是否为空
逻辑测试
逻辑测试指的是判断两个或多个条件之间的依赖关系。
 && 逻辑与,表示“而且”,只有当前后当个条件成立时,整个测试命令的返回值才为0(结果成立)
 || 逻辑或,表示“或者”,只有前后两个条件中有一个成立,整个测试命令的返回值即为0(结果成立)
 !逻辑否,表示“不”,只有当指定的条件不成立,整个测试命令的返回值为0(结果不成立)
单分支结构
If语句的“分支”指的是不同测试结果所对应的执行语句。对于单分支的选择结构,只有在“条件成立”时才会执行相应的代码,否则不执行任何操作。
单分支if局语句的执行流程:首先判断条件测试操作结果,如果返回值为0,表示条件成立,执行then后面的命令序列,一直遇见fi结果判断为止,继续执行其他脚本代码;如果返回值不为0,则忽略then后面的命令序列,直接跳到fi行以后执行其他脚本代码。
2,双分支if语句
对于双分支的选择结构,要求针对“条件成立”“条件不成立”两种情况分别执行不同的操作。
双分支if语句的执行流程:首先判断条件测试操作结果,如果成立,则执行then后面的命令序列1,忽略else及后面的命令序列2,直到遇见fi结果判断;如果条件不成立,则忽略then及后面命令序列1,直接跳到else后面的命令序列2并执行,直接遇到fi结束判断。
3,多分支if语句
多分支if语句执行流程:首先判断条件测试操作1的结果,如果条件1不成立,则执行命令序列1,然后跳至fi结果判断;如果条件1不成立,则继续判断条件测试操作2的结果,如果条件2成立,则执行命令序列2,然后跳至fi结果判断,如果所有的条件都不满足,则执行else后面的命令序列n,直到遇到fi结束判断

sed
概念
sed全名叫stream editor,流编辑器。用无交互式的方式来编辑文本。
我们知道,vim/vi 采用的是交互式文本编辑模式,你可以用键盘命令来交互性地插入、删除或替换数据中的文本。但本节要讲的 sed 命令不同,它采用的是流编辑模式,最明显的特点是,在sed 处理数据之前,需要预先提供一组规则,sed会按照此规则来编辑数据,实现无交互式编辑数据。
sed也是支持正则表达式的,如果要使用扩展正则加参数-r
sed的执行过程:
sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。
具体过程如下:
1、首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间)。
2、然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。
3、sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。
4、处理完输入文件的最后一行后,sed便结束运行。
大家需要注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据,并把修改结果只显示到屏幕上,除非使用"-i"选项才会直接修改文件。

sed 命令的基本格式如下:
[root@localhost ~]# sed [选项] ‘[动作指令]’ filename
选项:
-n 默认情况下,sed 会在动作指令执行完毕后,自动输出处理后的内容,而该选项会屏蔽默认输出。
-e 执行多个sed指令
-i 此选项会直接修改源文件,要慎用,修改前建议先备份源文件。
-i.bak 编辑源文件的同时创造.bak的备份
-r 使用扩展的正则表达式
动作指令:
p 打印 ,输出指定的行
S 替换,替换指定字符串
d 删除,删除行
a 增加行,在当前行下面插入文件
i 增加行,在当前行上面插入文件
c 把选定的行改为新的指定的文本
r 读取文件,即用于将一个独立文件的数据插入到当前数据流的指定位置
w 另存为
s
"替换"命令
/…/…/ 分割符 (Delimiter)
hello 搜索字符串(要被替换的字符串)
never
替换字符串(新的字符串

Seq命令

Sed的执行过程

 sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。

具体过程如下:

1、首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间)。

2、然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。

3、sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。

4、处理完输入文件的最后一行后,sed便结束运行。

大家需要注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据,并把修改结果只显示到屏幕上,除非使用"-i"选项才会直接修改文件。

Sed基本格式

   sed  [选项]  ‘[动作指令]’  filename

sed选项

选项:

-n 默认情况下,sed 会在动作指令执行完毕后,自动输出处理后的内容,而该选项会屏蔽默认输出。

   -e   执行多个sed指令

   -i    此选项会直接修改源文件,要慎用,修改前建议先备份源文件。

   -i.bak  编辑源文件的同时创造.bak的备份

   -r    使用扩展的正则表达式 

动作指令:

   p     打印 ,输出指定的行

S 替换,替换指定字符串

d 删除,删除行

a     增加行,在当前行下面插入文件

   i      增加行,在当前行上面插入文件

   c     把选定的行改为新的指定的文本

   r      读取文件,即用于将一个独立文件的数据插入到当前数据流的指定位置

   w    另存为

注意:动作指令要是用单引号或双引号括起来。

awk基础应用

概念

除了使用 sed 命令,Linux 系统中还有一个功能更加强大的文本数据处理工具,就是
awk。它诞生于 20 世纪 70 年代末期,这也许是它影响了众多 Linux 用户的原因之一。

AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。awk命名: Aho、Weingberger 和
Kernighan三个人的姓的缩写。

awk也是一个数据处理工具!相较于
sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个字段来处理。

和 sed 命令类似,awk 命令也是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理。

awk 命令的基本格式为:

awk [-F field-separator] ‘commands’
filename

其中,[-F域分隔符]是可选的,因为awk使用空格或tab键作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项,如果要浏览诸如passwd文件,此文件各域以冒号作为分隔符,则必须指明-F选项,如:awk -F: ‘commands’ filename

commands 是awk要执行的命令动作。

filename是要处理的文件。filename可以是多于一个文件的文件列表,awk将按顺序处理列表中的每个文件。

在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格或tab键。

此命令常用的选项以及各自的含义,如表所示:

选项

含义

-F fs

指定以 fs 作为输入行的分隔符,awk 命令默认分隔符为空格或制表符。

-v var=val

在执行处理过程之前,设置一个变量 var,并给其设备初始值为 val。

awk 的强大之处在于commands,它由2部分组成,分别为匹配规则和执行命令,如下所示:

‘匹配规则{执行命令}’

awk命令的完整格式:awd [-F field-separator] ‘匹配规则{执行命令}’ filename

这里的匹配规则,和 sed 命令中的匹配规则部分作用相同,用来指定执行命令可以作用到文本内容中的具体行(匹配条件),可以使用字符串(比如
/demo/,表示查看含有demo字符串的行)或者正则表达式指定。另外需要注意的是,整个commands是用单引号(’’)括起,而其中的执行命令部分需要用大括号({})括起来。

举个简单的例子:

[root@localhost
~]# awk ‘/^$/ {print “Blank line”}’ test.txt

在此命令中,/^$/ 是一个正则表达式,功能是匹配文本中的空白行,同时可以看到,执行命令使用的是 print 命令,此命令经常会使用,它的作用很简单,就是将指定的内容进行输出。因此,整个命令的功能是,如果 test.txt 有 N 个空白行,那么执行此命令会输出 N 个 Blank line。

注:在 awk 程序执行时,如果没有指定执行命令,则默认会把匹配的行输出;如果不指定匹配规则,则默认匹配文本中所有的行。

‘匹配规则{执行命令}’

任何awk语句都是由’匹配规则{执行命令}'组成,一个awk中可以有多个语句。匹配规则决定执行命令的执行条件。

例如上面举的例子中’/^KaTeX parse error: Expected group after '^' at position 26: …Blank line"}',/^̲/就是匹配规则,print就是执行命令,当文件中有匹配/^$/条件的行是就会执行pirnt命令。

匹配规则(即执行条件):

一般使用关系表达式作为条件。这些关系表达式非常多,具体参考下表:

条件类型

条 件

说 明

awk保留字

BEGIN

在awk程序一开始,尚未读取任何数据之前执行。BEGIN 后的动作只在程序开始时执行一次

awk保留字

END

在awk程序处理完所有数据,即将结束时执行。END 后的动作只在程序结束时执行一次

关系运算符

大于

<

小于

=

大于等于

<=

小于等于

==

等于。用于判断两个值是否相等。如果是给变童赋值,则使用"=”

!=

不等于

匹配表达式

~(匹配)

value
/regexp/ 如果value匹配/regexp/,则返回真

!~(不匹配)

value
!~ /regexp/ 如果value不匹配/regexp/,则返回真

正则表达式

/正则表达式/

如果在“//”中可以写入字符,则也可以支持正则表达式,如:/root/表示匹配含有root的行。

逻辑运算符

&&

逻辑与

||

逻辑或

例如:

[root@localhost ~]# awk -F: ‘ 7   / b a s h 7 ~ /bash 7 /bash/ {print $1}’ /etc/passwd

判断 7 ( 第 7 个 数 据 字 段 ) 的 值 是 否 匹 配 正 则 表 达 式 / b a s h 7(第7个数据字段)的值是否匹配正则表达式/bash 77/bash/

[root@localhost
~]# awk -F: ‘ 7 !   / b a s h 7 !~ /bash 7! /bash/ {print $1}’ /etc/passwd

判断 7 ( 第 7 个 数 据 字 段 ) 的 值 是 否 不 匹 配 正 则 表 达 式 / b a s h 7(第7个数据字段)的值是否不匹配正则表达式/bash 77/bash/

awk 使用数据字段变量

前面说过,在 awk 中,默认的字段分隔符是任意的空白字符(例如空格或制表符)。
在文本行中,每个数据字段都是通过字段分隔符划分的(-F选项指定的分隔符)。awk
在读取一行文本时,会用预定义的字段分隔符划分每个数据字段。如/etc/passwd文件中可以将“:”当做字段分隔符,共划分成7个数据字段。

awk 的主要特性之一是其处理文本文件中数据的能力,它会自动给一行中的每个数据字段分配一个变量。

默认情况下,awk 会将如下变量分配给它在文本行中发现的数据字段:

n $0 代表整个文本行;

n $1 代表文本行中的第 1 个数据字段;

n $2 代表文本行中的第 2 个数据字段;

n $n 代表文本行中的第 n 个数据字段。

执行命令(动作action):

awk的执行命令在大括号{ }内指明。动作大多数用来打印(即print指令),但是还有些更长的代码诸如i f和循环语句及循环退出结构。如果不指明采取动作,awk将打印出所有浏览出来的记录。

动作(Action):

n 格式化输出(print);

流程控制语句(if、while、for等);

awk中的BEGIN和END

语法:

awk [options] ‘BEGIN{ print “start” } 匹配规则{ commands } END{ print “end” }’ filename

其中:BEGIN
END是AWK的关键字,因此必须大写;这两个部分开始块和结束块是可选的

   BEGIN模块:BEGIN 的执行时机是"在

awk 程序一开始,尚未读取任何数据之前"。一旦BEGIN后的动作执行一次,当awk开始从文件中读入数据时,BEGIN 的条件就不再成立,所以BEGIN定义的动作只能被执行一次。通过BEGIN开始块我们可以用来设置变量,设置标题。

例如:

#这里定义了两个动作

#第一个动作使用BEGIN条件,所以会在读入文件数据前打印"print username and loginshell" (只会执行一次)

#第二个动作会在条件满足时打印文件的第1个字段和第7个字段

   END模块:END也是awk的保留字,不过刚好和 BEGIN 相反。END 是在 awk

程序处理完所有数据,即将结束时执行的。END 后的动作只在程序结束时执行一次。

例如:

输出结尾输入"The End",这并不是文档本身的内容,而且只会执行一次

Awk工作过程

通过上面我们可以知道;AWK它工作过程

1.如果BEGIN块存在,awk执行它指定的actions。

2.awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取),awk将读入的记录分割成多个字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。

3、把当前输入记录与awk中’匹配规则{执行命令}'中的“匹配规则”比较,看是否匹配,如果相匹配,就执行对应的‘执行命令’。如果不匹配,就跳过对应的执行命令。

4、awk读取输入的下一行,继续重复步骤2和3,这个过程一直持续,直到awk读取到文件尾。

5、当awk读完所有的输入行后,如果存在END,就执行相应的actions。

awk的变量

awk自定义变量

自定义变量:用户自己定义的变量,有两种形式

1、-v
varname=value 变量名区分字符大小写

2、在program中直接定义,以下定义了3个自定义变量,其实形式像编程语言一样,定义的时候用分号。打印变量跟之前一样,用逗号隔开,注意,不需要用美元符号。

3、也可以引用命令行定义的变量

注:之前的{}里都是只有一个print语句,其实print只是一个语句,而{}可以有多个语句,以;号隔开。

awk内置变量(预定义变量)

awk除了可以自定义变量外,awk还提供一些内置量,常用的内置标量如下:

$n 当前记录(当前行)的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段

$0 这个变量包含执行过程中当前行的文本内容

FILENAME 当前输入文件的名

FS 字段分隔符(默认是任何空格)

NF 表示字段数,在执行过程中对应于当前的字段数

NR 表示记录数,在执行过程中对应于当前的行号

FNR 各文件分别计数的行号

awk控制语句

if语句

if (条件) print

if(条件){print}else{print}

if(条件){print}else
if(条件){print}else{print}

while循环

语句:while(条件){语句} 如果条件为“真”进入循环,条件为“假”退出循环

在进行运算结果统计时,可以使用符号+=,意思是说我们可以把增加的结果赋值给符号的左边的变量,对哪个域操作就把哪个域写在符号的右边,如Total+=$3

for循环

语法:for(变量赋值;条件;迭代){命令}

偶数(next)

打印奇数或偶数行

数组

定义

数组是一个包含一系列元素的集合。

格式如下:

abc[1]=”xiaohong”

abc[2]=”xiaolan”

解释:

abc :为数组名称

[1]、[2]:为数组元素下标,可以理解为数组的第1个元素、数组的第2个元素

”xiaohong”、”xiaolan”: 元素内容

数组变量赋值的格式

var[index]=element

说明:var====>是数组名

      index===>是关联数组的下标

      element===>是数组的元素值

数字做数组下标:

   array[1]=”sun”

   array[2]=”kai”

字符串做数组下标:

   array[“first”]=”www”

   array[“last”]=”name”

我们在引用数组变量的时候,必须要包含它的下标值,然后通过下标值来提取它相对应的元素值

遍历数组中的元素

若要遍历数组中的每个元素,可以使用for循环:

for(var in array){print array[var]}

说明: for循环在每次循环时会将数组array的一个下标值赋给变量var,然后去执行大括号中的语句。还有一个需要注意的地方就是这个变量var中存储的是下标值而不是数组的元素值。我们可以把这个变量当作是数组的下标,然后来提取出对应元素值

cut命令

定义

cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。

主要参数

   -d :自定义分隔符,默认为制表符。

   -f  :与-d一起使用,指定显示哪个区域。

Seq命令

Sed的执行过程

 sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。

具体过程如下:

1、首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间)。

2、然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。

3、sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。

4、处理完输入文件的最后一行后,sed便结束运行。

大家需要注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据,并把修改结果只显示到屏幕上,除非使用"-i"选项才会直接修改文件。

Sed基本格式

   sed  [选项]  ‘[动作指令]’  filename

sed选项

选项:

-n 默认情况下,sed 会在动作指令执行完毕后,自动输出处理后的内容,而该选项会屏蔽默认输出。

   -e   执行多个sed指令

   -i    此选项会直接修改源文件,要慎用,修改前建议先备份源文件。

   -i.bak  编辑源文件的同时创造.bak的备份

   -r    使用扩展的正则表达式 

动作指令:

   p     打印 ,输出指定的行

S 替换,替换指定字符串

d 删除,删除行

a     增加行,在当前行下面插入文件

   i      增加行,在当前行上面插入文件

   c     把选定的行改为新的指定的文本

   r      读取文件,即用于将一个独立文件的数据插入到当前数据流的指定位置

   w    另存为

注意:动作指令要是用单引号或双引号括起来。

awk基础应用

概念

除了使用 sed 命令,Linux 系统中还有一个功能更加强大的文本数据处理工具,就是
awk。它诞生于 20 世纪 70 年代末期,这也许是它影响了众多 Linux 用户的原因之一。

AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。awk命名: Aho、Weingberger 和
Kernighan三个人的姓的缩写。

awk也是一个数据处理工具!相较于
sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个字段来处理。

和 sed 命令类似,awk 命令也是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理。

awk 命令的基本格式为:

awk [-F field-separator] ‘commands’
filename

其中,[-F域分隔符]是可选的,因为awk使用空格或tab键作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项,如果要浏览诸如passwd文件,此文件各域以冒号作为分隔符,则必须指明-F选项,如:awk -F: ‘commands’ filename

commands 是awk要执行的命令动作。

filename是要处理的文件。filename可以是多于一个文件的文件列表,awk将按顺序处理列表中的每个文件。

在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格或tab键。

此命令常用的选项以及各自的含义,的分隔符,awk 命令默认分隔符为空格或制表符。
处理过程之前,设置一个变量 var,并给其设备初始值为 val。

awk 的强大之处在于commands,它由2部分组成,分别为匹配规则和执行命令,如下所示:

‘匹配规则{执行命令}’

awk命令的完整格式:awd [-F field-separator] ‘匹配规则{执行命令}’ filename

这里的匹配规则,和 sed 命令中的匹配规则部分作用相同,用来指定执行命令可以作用到文本内容中的具体行(匹配条件),可以使用字符串(比如
/demo/,表示查看含有demo字符串的行)或者正则表达式指定。另外需要注意的是,整个commands是用单引号(’’)括起,而其中的执行命令部分需要用大括号({})括起来。

举个简单的例子:

[root@localhost
~]# awk ‘/^$/ {print “Blank line”}’ test.txt

在此命令中,/^$/ 是一个正则表达式,功能是匹配文本中的空白行,同时可以看到,执行命令使用的是 print 命令,此命令经常会使用,它的作用很简单,就是将指定的内容进行输出。因此,整个命令的功能是,如果 test.txt 有 N 个空白行,那么执行此命令会输出 N 个 Blank line。

注:在 awk 程序执行时,如果没有指定执行命令,则默认会把匹配的行输出;如果不指定匹配规则,则默认匹配文本中所有的行。

‘匹配规则{执行命令}’

任何awk语句都是由’匹配规则{执行命令}'组成,一个awk中可以有多个语句。匹配规则决定执行命令的执行条件。

例如上面举的例子中’/^KaTeX parse error: Expected group after '^' at position 26: …Blank line"}',/^̲/就是匹配规则,print就是执行命令,当文件中有匹配/^$/条件的行是就会执行pirnt命令。
则(即执行条件):

一般使用关系表达式作为条件。这些关系表达式非常多,具体参考下表:
条件类型条 件说 明awk保留字BEGIN
在awk程序一开始,尚未读取任何数据之前执行。BEGIN 后的动作只在程序开始时执行一次awk保留字 END

在awk程序处理完所有数据,即将结束时执行。END 后的动作只在程序结束时执行一次
关系运算符
>
大于<
小于>=
大于等于<=
小于等于==
等于。用于判断两个值是否相等。如果是给变童赋值,则使用"=”!=
不等于
匹配表达式
~(匹配)
value
~ /regexp/ 如果value匹配/regexp/,则返回真
!~(不匹配)
value
!~ /regexp/ 如果value不匹配/regexp/,则返回真
正则表达式
/正则表达式/
如果在“//”中可以写入字符,则也可以支持正则表达式,如:/root/表示匹配含有root的行。
逻辑运算符
&&
逻辑与
逻辑或

[root@localhost ~]# awk -F: ‘ 7   / b a s h 7 ~ /bash 7 /bash/ {print $1}’ /etc/passwd

判断 7 ( 第 7 个 数 据 字 段 ) 的 值 是 否 匹 配 正 则 表 达 式 / b a s h 7(第7个数据字段)的值是否匹配正则表达式/bash 77/bash/

[root@localhost~]# awk -F: ‘ 7 !   / b a s h 7 !~ /bash 7! /bash/ {print $1}’ /etc/passwd

判断 7 ( 第 7 个 数 据 字 段 ) 的 值 是 否 不 匹 配 正 则 表 达 式 / b a s h 7(第7个数据字段)的值是否不匹配正则表达式/bash 77/bash/

awk 使用数据字段变量

前面说过,在 awk 中,默认的字段分隔符是任意的空白字符(例如空格或制表符)。
在文本行中,每个数据字段都是通过字段分隔符划分的(-F选项指定的分隔符)。awk
在读取一行文本时,会用预定义的字段分隔符划分每个数据字段。如/etc/passwd文件中可以将“:”当做字段分隔符,共划分成7个数据字段。

awk 的主要特性之一是其处理文本文件中数据的能力,它会自动给一行中的每个数据字段分配一个变量。

默认情况下,awk 会将如下变量分配给它在文本行中发现的数据字段:

n $0 代表整个文本行;

n $1 代表文本行中的第 1 个数据字段;

n $2 代表文本行中的第 2 个数据字段;

n $n 代表文本行中的第 n 个数据字段。
动作action):

awk的执行命令在大括号{ }内指明。动作大多数用来打印(即print指令),但是还有些更长的代码诸如i f和循环语句及循环退出结构。如果不指明采取动作,awk将打印出所有浏览出来的记录。

动作(Action):

n 格式化输出(print);

流程控制语句(if、while、for等);
中的BEGIN和END

语法:

awk [options] ‘BEGIN{ print “start” } 匹配规则{ commands } END{ print “end” }’ filename

其中:BEGIN
END是AWK的关键字,因此必须大写;这两个部分开始块和结束块是可选的

   BEGIN模块:BEGIN 的执行时机是"在

awk 程序一开始,尚未读取任何数据之前"。一旦BEGIN后的动作执行一次,当awk开始从文件中读入数据时,BEGIN 的条件就不再成立,所以BEGIN定义的动作只能被执行一次。通过BEGIN开始块我们可以用来设置变量,设置标题。

例如:

#这里定义了两个动作

#第一个动作使用BEGIN条件,所以会在读入文件数据前打印"print username and loginshell" (只会执行一次)

#第二个动作会在条件满足时打印文件的第1个字段和第7个字段

   END模块:END也是awk的保留字,不过刚好和 BEGIN 相反。END 是在 awk

程序处理完所有数据,即将结束时执行的。END 后的动作只在程序结束时执行一次。

例如:

输出结尾输入"The End",这并不是文档本身的内容,而且只会执行一次
Awk工作过程
通过上面我们可以知道;AWK它工作过程

1.如果BEGIN块存在,awk执行它指定的actions。

2.awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取),awk将读入的记录分割成多个字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。

3、把当前输入记录与awk中’匹配规则{执行命令}'中的“匹配规则”比较,看是否匹配,如果相匹配,就执行对应的‘执行命令’。如果不匹配,就跳过对应的执行命令。

4、awk读取输入的下一行,继续重复步骤2和3,这个过程一直持续,直到awk读取到文件尾。

5、当awk读完所有的输入行后,如果存在END,就执行相应的actions。

awk的变量

awk自定义变量

自定义变量:用户自己定义的变量,有两种形式

1、-v
varname=value 变量名区分字符大小写

2、在program中直接定义,以下定义了3个自定义变量,其实形式像编程语言一样,定义的时候用分号。打印变量跟之前一样,用逗号隔开,注意,不需要用美元符号。

3、也可以引用命令行定义的变量

注:之前的{}里都是只有一个print语句,其实print只是一个语句,而{}可以有多个语句,以;号隔开。

awk内置变量(预定义变量)

awk除了可以自定义变量外,awk还提供一些内置量,常用的内置标量如下:

$n 当前记录(当前行)的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段

$0 这个变量包含执行过程中当前行的文本内容

FILENAME 当前输入文件的名

FS 字段分隔符(默认是任何空格)

NF 表示字段数,在执行过程中对应于当前的字段数

NR 表示记录数,在执行过程中对应于当前的行号

FNR 各文件分别计数的行号

awk控制语句

if语句

if (条件) print

if(条件){print}else{print}

if(条件){print}else
if(条件){print}else{print}
while循环

语句:while(条件){语句} 如果条件为“真”进入循环,条件为“假”退出循环

在进行运算结果统计时,可以使用符号+=,意思是说我们可以把增加的结果赋值给符号的左边的变量,对哪个域操作就把哪个域写在符号的右边,如Total+=$3
for循环

语法:for(变量赋值;条件;迭代){命令}
偶数(next)

打印奇数或偶数行

定义

数组是一个包含一系列元素的集合。

格式如下:

abc[1]=”xiaohong”

abc[2]=”xiaolan”

解释:

abc :为数组名称

[1]、[2]:为数组元素下标,可以理解为数组的第1个元素、数组的第2个元素

”xiaohong”、”xiaolan”: 元素内容

数组变量赋值的格式

var[index]=element

说明:var====>是数组名

      index===>是关联数组的下标

      element===>是数组的元素值

数字做数组下标:

   array[1]=”sun”

   array[2]=”kai”

字符串做数组下标:

   array[“first”]=”www”

   array[“last”]=”name”

我们在引用数组变量的时候,必须要包含它的下标值,然后通过下标值来提取它相对应的元素值

遍历数组中的元素

若要遍历数组中的每个元素,可以使用for循环:

for(var in array){print array[var]}

说明: for循环在每次循环时会将数组array的一个下标值赋给变量var,然后去执行大括号中的语句。还有一个需要注意的地方就是这个变量var中存储的是下标值而不是数组的元素值。我们可以把这个变量当作是数组的下标,然后来提取出对应元素值

cut命令

定义

cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。

主要参数

   -d :自定义分隔符,默认为制表符。

   -f  :与-d一起使用,指定显示哪个区域。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值