sell 总结文档

一,编制第一个shell脚本
Linux系统中的shell脚本是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作系统(命令)并进行解释,将需要执行的操作系统传递给内核执行,并输入执行结果。
常见的shell解释器程序有很多,通过/etc/shells文件可以了解当前系统所支持的shell脚本种类。
举例:cat /etc/shells
什么是“shell脚本”呢?就是将平时使用的各种Linux命令按顺序保存到一个文本文件中,加上可执行权限,成为了一个shell脚本了。

举例:vi first.sh         新建first.sh文件
 cd /boot
 pwd
 ls -lh vml*
     chmod +x first.sh    添加可执行权限
     ./first.sh            直接运行脚本

一个合格的脚本程序应该遵循标准的脚本结构,而且能够输出友好的提示信息,更好容易读懂。改写后的first.sh脚本如下:

  #!/bin/bash
  #this is my first shell
  cd /boot
  echo “当前的目录位于:”
  pwd
  echo “其中vml开头的文件包括:”
  ls -lh vml*
  echo 命令用于输出字符,使脚本的输出信息更容易读懂
   执行first.sh脚本中的语句。
	Sh first.sh
	. first.sh
	./first.sh

二,重定向与管道操作
1,重定向操作
 标准输入(stdin):默认的设备是键盘,文件编号是0,命令将从标准输入文件中读取在执行过程中需要的输入数据。
 标准输入(stdout):默认的设备是显示器,文件编号1,命令将执行后输入结果发送到标准输出文件。
 标准错误(stderr):默认的设备是显示器,文件编号2,命令将执行期间的各种错误信息发送到标准错误文件。
1) 重定向输出
重定向输出指的是将命令的正确输出结果保存到指定的文件中,而不是直接显示在显示屏幕上。重定向输出使用“>”或“>>”操作符号,分别用于覆盖或追加文件。
举例:uname -p > kernet.txt 将主机的cpu类型信息保存到kernel.txt文件中。
当需要保留目标文件原有的内容时,应该用“>>”操作符号,追加内容而不是全部覆盖。
举例:uname -r >> kernel.txt
2)重定向输入
重定向输入指的是将命令中的接收输入的路径有默认的键盘改为指定的文件。用“<”操作符号。

 举例:vi pass.txt   添加初始密码为123456
         123456
  Passwd --stdin jerry < pass.txt 从pass.txt中提取密码

3)错误重定向
错误重定向指的是将执行命令过程中出现的错误信息保存到指定的文件,而不是在屏幕上直接显示。使用“2>”操作符号,其中“2”是指错误文件的编号。

举例:执行以下操作可以将使用tar命令进行备份时出现的错误信息保存error.log文件中
     Tar jcf /tmp/etc.tar.gz   /etc  2> error.log

注意:使用“2>”操作时,会覆盖目标文件的内容,若要追加内容而不是覆盖文件,则应该用“2>>”操作符。
2,管道操作
管道操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,将作为右侧命令的输入,同一行命令中可以使用多个管道。
举例:grep “/bin/bash ” / e t c / p a s s w d 提 取 以 b a s h 结 尾 的 文 件 G r e p “ / b i n / b a s h ” /etc/passwd 提取以bash结尾的文件 Grep “/bin/bash /etc/passwdbashGrep/bin/bash” /etc/passwd | awk -F : ‘{print $1,$7}’
提取以bash结尾的文件的第一和第七个字符
注意:awk命令的作用是以冒号:作为分隔,输入第1,第7个区域的字符串。(-F用于指定的分隔符号,默认以空格分隔)。
三,使用shell变量
Shell变量是用来存放系统和用户需要使用的特定参数,而且这些参数可以根据用户的设定或系统环境的变化相应的变化。 常见的类型有自定义变量、环境变量、位置变量、预定义变量、
1,自定义变量
1)定义一个新的变量
定义变量的基本格式为:变量名=变量值,

举例:product=Python
      Version=2.7.13

2)查看和引用变量的值
通过在变量名称前添加符号:$。可以引用一个变量值。使用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 $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  $dir2

 设置变量的作用范围
默认情况下,新定义的变量在当前的shell环境变量中有效,因此称为局部变量。为了使用户自定义的变量在所有的子shell环境中能够继续使用,可以通过内部命令export将制定的变量导出为全局变量。

举例:echo “$product  $version”   查看当前定义的变量值
      Echo  product version       将product version 设置全局变量
      Bash     进入子shell环境
      Echo  “$product $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  +  $2`
echo$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 测试是否设置有可执行

举例:执行以下操作可测试目录/media是否存在,如果返回值为$?为0,表示存在此目录。
[   -d  /media   ]
echo $?

若条件不成立,则测试操作的返回值将不为0(通常为1)

举例:[  -d  /media/chrom/server  ]
 echo $?

为了更直观的查看测试结果,可以结合命令分隔符“&&”和echo命令一起使用,当条件成立时直接输出“yes”

举例:[  -d   /media/cdrom/server  ]  &&  echo “yes”  无输出表示该目录不存在
      [  -d   /media/cdrom  ]   &&  echo “yes”       输出yes表示目录存在

2,整数值比较
整数值比较指的是根据给定的两个数值,判断第一个数与第二个数的关系。
 -eq 第一个数等于第二个数
 -ne 第一个数不等于第二个数
 -gt 第一个数大于第二个数
 -lt 第一个数小于第二个数
 -le 第一个数小于或等于第二个数
 -ge 第一个数大于或等于第二个数

 举例:判断当前已登录的用户,当超过两个时,输出“too many”.
  unum=`who | wc -l`
   [  $unum  -gt  2  ]    &&  echo  “too many” 

3,字符串的比较
字符串比较通常用来检查用户输入、系统环境的是否满足条件。
 = 第一个字符串与第二个字符串相同
 != 第一个字符串与第二个字符串不相同,其中!符号表示相反
 -z 检查字符串是否为空

 举例:判断当前系统的语言环境,当发现不是en.US时输出提示信息为“not  en.us”。
 echo $LANG    查看当前的语言环境
 [ $LANG!="en.US" ]  &&   echo " not en.US"

4,逻辑测试
逻辑测试指的是判断两个或多个条件之间的依赖关系。
 && 逻辑与,表示“而且”,只有当前后当个条件成立时,整个测试命令的返回值才为0(结果成立)
 || 逻辑或,表示“或者”,只有前后两个条件中有一个成立,整个测试命令的返回值即为0(结果成立)
 !逻辑否,表示“不”,只有当指定的条件不成立,整个测试命令的返回值为0(结果不成立)

举例:若要判断当前Linux系统的内核版本是否大于3.4可以执行以下操作。
uname  -r 
mnum=$( uname  -r | awk -F.  ‘{print $1})      取主版本号
snum=$( uname  -r | awk -F.  ‘{print $2})      取次版本号
[  $mnum  -ge   3  ]  &&  [  $snum  -gt   4  ]   &&  echo  “条件要求”

1,单分支结构
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结束判断

一、使用for循环语句
在实际工作当中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样。使用for循环语句时,而要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列,直到变量值用完退出循环。
流程:首先将列表中第一个取值赋给变量,并执行do…done循环体系中的命令序列;然后将列表中的第二个赋值给变量,并执行循环体系中的命令序列,直到列表中的所有取值用完,最后将跳至done语句,表示结束循环。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

举例:vi  /root/users.txt
       Chengye
       Dengchao
       Zhangjie
     Vi  uaddfor.sh
#!/bin/bash
ULIST=$(cat/root/users.txt)
For  uname  in  $ULIST
Do
   Useradd  $uname
   Echo  ”123456” | passwd  --stdin  $uname  &>  /dev/null
Done             

从users.txt文件中读取各用户名称、重复执行添加用户、设置初始密码
Chmod +x uaddfor.sh 添加执行权限
二、使用while循环语句
For循环语句适用于列表对象无规律,且列表来源已固定的场合。
而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况——while语句。
1,while语句结构
使用while循环语句时,可以根据特定的条件反复执行一个命令序列,直接该条件不在满足时为止。
While语句的执行流程:首先判断while 后的条件测试操作结果,如果条件成立,则执行do……done循环体系中的命令序列;返回while后再次判断条件测试结果,如果条件仍然成立,则继续执行循环体;再次返回到while后,判断条件测试结果……如此循环,直接while后的条件测试结果不再成立为止,最后跳到done语句,表示结束循环。
使用while循环语句时,有两个特殊的条件条件测试操作,即true(真)和false(假)。

举例:若要添加20个用户,名称依次为stu1,stu2……stu20.
vi uaddwhile.sh
#!/bin/bash                          
prefix=”stu”
i=1                                    
while  [  $i  -le  20  ]
do                                        
  useradd  ${prefix}$i
  echo  “123456”  |  passwd  --stdin  ${prefix}$i  &>  /dev/null
 let  i++
done

chmod  +x  uaddwhile.sh
 ./uaddwhile.sh
grep “stu”  /etc/passwd | tail  -3  测试并确认uaddwhile.sh脚本

三,使用case分支语句
Case语句只用于一下情况:某个变量存在多个取值,需要对其中的每一种取值分别执行不同的命令序列。If语句需要判断多个不同的条件,而case语句只判断一个变量的不同取值。
执行流程:首先使用“变量值”与模式1进行比较,若取值相同则执行模式1后的命令序列,直接遇见双分号“;;” 后跳至esac,表示结束分支;若模式1不匹配,则继续与模式2进行比较,若取值相同则执行模式2后的命令序列,直到遇到双分号“;;”后跳至esac,表示结束分支…以此类推,若找不到匹配值,则执行默认模式“)”后的命令序列,直到遇到esac后结束分支。
注意:1,case行尾必须为单词“in”,每一个模式必须以右括号“)”结束
2,双分号“;;”表示命令序列的结束;
3,模式字符中,可以用方括号表示一个连续的范围,如“[0-9]”;还可以用竖杠符号“|”表示或,如果“A|B”
4,最后的*)表示默认模式,其中的*相当于通配符。

  举例:1,检查用户输入的字符类型
       提示用户从键盘输入一个字符,通过case语句判断该字符是个为字母、数字或者其他控制字符,并给出相应的提示信息。
 vi hitkey.sh
#!/bin/bash
read -p “请输入一个字符,并按回车确认:” key
case   $key   in
   [a-z]|[A-Z]echo “您输入的是 字母”
   ;;
[0-9]echo “您输入的是 数字”
   ;;
*)*
echo “您输入的是什么,小爱不认识”
esac

一,正则表达式
正则表达式是使用单个字符串来描述,匹配一系列符合某个语法规则的字符串。简单的说,是一种匹配字符串的方法,通过一些特殊的符号,实现快速查找,删除,替换某个特定字符串。
正则表达式一般用于脚本编程与文件编辑器中。
1,基础正则表达式
基础正则表达式是常用的正则表达式的最基础的部分。在linux系统中常见的文件处理工具中grep与sed支持基础正则表达式,而egrep与awk支持扩展正则表达式。
提前准备一个名为test.txt的测试文件。
 查找特定字符
查找特定字符非常简单,执行以下命令可以从test.txt文件中查找特定字符
“the”所在位置。其中“-n”表示显示行号,“-i”表示不区分大小写。

举例:grep  -n  ‘the’  test.txt
      Grep  -in   ‘the’  tset.txt
	反向查找,查找不包含“the”字符行,则需要通过grep命令的-vn选项
   Grep  -vn  ‘the’ test.txt

 利用中括号[]来查找集合字符
 想要查找“shirt”与“short”这两个字符串时,可以发现的两个字符串均包含“sh”与“rt”
。此时执行以下命令既可同时查找到“shirt”与“short”这两个字符串。“[]”中无论有几个字符,都仅代替一个字符,也就是说“[io]”表示匹配“i”或者“o”

举例:grep  -n  ‘sh[io]rt’  test.txt

 若要查找包含重复单个字符“oo”时,只需要执行以下命令既可。

Grep  -n  ‘oo’  test.txt

 若要查找“oo”前面不是“w”的字符串,只需要通过集合字符的反向选项“[^]”来实现该目的,

举例:grep   -n   ‘[^w]oo’ test.txt

表示在test.txt文件中查找‘oo’前面不是‘w’的字符串。
 若不希望“oo”前面存在小写字母,可以使用以下命令来实现。其中“a-z”表示小写字母,大写字母则通过“A-Z”表示。

  Grep  -n  ‘[^a-z]oo’  test.txt

 查找包含数字的行可以通过以下命令来实现

Grep -n ‘[0-9]’ test.txt

 查找行首“^”与行尾“$”
查询以“the”字符串为行首的行,则可以通过“^”元字符来实现。

   Grep  -n   ‘^the’  test.txt

 当“^”符号在元字符集合“[]”符号内外的作用的不一样的。在[]符号内表示反向选择,在[]符号外则代表定位行首。
举例:查询不以字母开头的行则使用“[a-zA-Z]”规则”

   Grep -n  ‘^[a-zA-Z]’  test.txt

 查询空白行时,执行“grep -n ‘^$’ test.txt”命令既可。

   Grep  -n   ‘^$’  test.txt

 查找任意一个字符“.”与重复字符“*”
*执行以下命令可以查找“w??d” 的字符串,共有四个字符,以w开头d结尾。

Grep  -n  ‘w..d’   test.txt

查看包含至少两个o以上的字符串,可以执行

`grep  -n  ‘ooo*’* test.txt`

查询以w开头d结尾,中间包含至少一个o的字符串

 Grep  -n  ‘woo*d’  test.txt

查找以w开头d结尾,中间的字符可有可无的字符串、

Grep  -n  ‘w.*d’  test.txt

查询任意数字所在行

Grep   -n   ‘[0-9][0-9]*’  test.txt

 查询连续字符范围“{}”
查询两个o的字符

Grep  -n   ‘o\{2\}’  test.txt     \:转义字符,将{}字符转换为普通字符。

查询以w开头以d结尾中间包含2~5个o的字符串

Grep   -n  ‘wo\{2,5\}d’   test.txt

查询以w开头以d结尾,中间包含两个以上o的字符串。

  Grep  -n  ‘wo\{2,\}d’   test.txt
                基础元字符

元字符 作 用
匹配前面的一个字符或子表达式0次或任意多次。如:a*hello匹配所有0个或多个a后,紧跟hello的行。即hello前面可以有任意多个a。
匹配除换行符和回车符(“\n”和"\r")外的任意一个字符。例如:l…e匹配包含一个l,后跟两个任意字符,然后跟一个e的行。

^ 匹配行首。例如,^hello 会匹配以 hello 开头的行。
$ 匹配行尾。例如,hello$ 会匹配以 hello 结尾的行
^$ 匹配空行
[ ]匹配中括号中指定的任意一个字符,而且只匹配一个字符。例如[aoeiu]匹配任意一个元音字母, [0-9] 匹配任意一位数字,[a-z][0-9] 匹配由小写字母和一位数字构成的两位字符,[a-zA-Z] 匹配任意一位英文字母

[^] 匹配除中括号中的字符以外的任意一个字符。例如,[^0-9] 匹配任意一位非数字字符,[^a-z] 匹配任意一位非小写字母,
注意:可以用^标记做[]内的前缀,表示除[]内的字符以外的任意一个字符。比如:搜索oo前没有g的字符串的行,应用 ‘[^g]oo’ 作搜索字符串。符号如果出现在[]的起始位置表示否定,但是在[]的其他位置是普通字符。[ab^c] 匹配除了a、b、^、c以外的任意单个字符。
\ 转义符,用于取消特殊符号的含义,使该特殊字符成为普通字符。例如:^.[0-9][0-9]表示匹配以一个句点和两个数字开始。
{n} 表示其前面的字符出现 n 次。例如,[0-9]{4} 匹配4位数字,1[35-9][0-9]{9} 匹配手机号码。
{n,} 表示其前面的字符出现不少于 n 次。例如,[0-9]{2,} 匹配两位及以上的数字
{n,m} 表示其前面的字符至少出现 n 次,最多出现 m 次。例如,[a-z]{6,8} 匹配 6〜8 位的小写字母
<
> 匹配词(word)的开始(<)和结束(>)。例如正则表达式<the>能够匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:这个元字符不是所有的软件都支持的。
扩展正则表达式
熟悉正则表达式的人应该很疑惑,在正则表达式中应该还可以支持一些元字符,比如"+"、"?"、"|"、"()"。
其实 Linux 是支持这些元字符的,只是 grep 命令默认不支持而已,因为grep把这些扩展元字符看成是普通符号,如果要想支持这些元字符,则可以使用 egrep 或 grep -E 命令。所以我们又把这些元字符称作扩展元字符。
如果査询 egrep 命令的帮助,对 egrep 的说明就是和 grep -E 一样的命令,
Shell 中支持的扩展元字符。
扩展元字符 描述

  • 匹配前面的一个字符或子表达式1次或任意多次。
    如“go+gle”会匹配“gogle” “google”或“gooogle”。当然,如果“o”有更多个,则也能匹配。
    egrep “go+gle” filename或grep -E “go+gel” filename
    ? 匹配前面的一个字符或子表达式零次或一次。例如:如 “colou?r” 可以匹配 “colour” 或 “color”
    | 表示或。如“was|his”既会匹配包含“was”的行,或匹配包含“his”的行
    () 将括号里的内容看成是一个整体。可以理解为由多个单个字符组成的大字符。
    如“(dog)+”会匹配“dog” “dogdog” “dogdogdog”等,因为被()包含的字符会被当成一个整体。但 “hello(world|earth)” 会匹配 “hello world” 及 “hello earth”

注:"+"、"?"、"|"、"()"、"{}“等扩展元字符egrep命令或grep -E是支持的。grep命令在不加-E选项的情况下可以按如下格式写:”+"、"?"、"|"、"()"、"{}"

                                                     **sed命令**

1、Sed的执行过程
sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。
具体过程如下:
1)、首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间)。
2)、然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。
3)、sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。
4)、处理完输入文件的最后一行后,sed便结束运行。
大家需要注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据,并把修改结果只显示到屏幕上,除非使用"-i"选项才会直接修改文件。
2、Seq基本格式
sed [选项] ‘[动作指令]’ filename
3、seq选项
-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 '/^KaTeX parse error: Expected group after '^' at position 41: …est.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 会将如下变量分配给它在文本行中发现的数据字段:
 $0 代表整个文本行;
 $1 代表文本行中的第 1 个数据字段;
 $2 代表文本行中的第 2 个数据字段;
 $n 代表文本行中的第 n 个数据字段。

执行命令(动作action):
awk的执行命令在大括号{ }内指明。动作大多数用来打印(即print指令),但是还有些更长的代码诸如i f和循环语句及循环退出结构。如果不指明采取动作,awk将打印出所有浏览出来的记录。
动作(Action):
 格式化输出(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一起使用,指定显示哪个区域。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值