Shell脚本编程

 

Shell脚本编程学习记录

说明

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

Shell环境

Shell 编程跟 JavaScriptphp 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Linux Shell 种类众多,常见的有:

  • Bourne Shell/usr/bin/sh/bin/sh
  • Bourne Again Shell/bin/bash
  • C Shell/usr/bin/csh
  • K Shell/usr/bin/ksh
  • Shell for Root/sbin/sh
  • ……

脚本格式

vim shell.sh

  #!/bin/bash    //声明脚本解释器,这个‘#’号不是注释,其余是注释

  #Program:     //程序内容说明

  #History:     //时间和作者

Shell变量

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

your_name="qinjx"

echo $your_name

echo ${your_name}

 

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

下面的例子尝试更改只读变量,结果报错:

#!/bin/bash

myUrl="http://www.google.com"

readonly myUrl

myUrl="http://www.runoob.com"

运行脚本,结果如下:

/bin/sh: NAME:This variable is read only.

 

删除变量

使用 unset 命令可以删除变量。语法:

unset variable_name

变量被删除后不能再次使用。unset 命令不能删除只读变量。

变量类型

运行shell时,会同时存在三种变量:

  • 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  • 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  • 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

Bash语法

变量赋值

a=123
read name
b=$(ls /home)
把命令的执行结果赋值给变量

使用变量

echo $a
let a=a+1
系统变量

  $0 这个程序的执行名字
  $n  这个程序的第n个参数值,n=1...9
  $*  这个程序的所有参数
  $# 这个程序的参数个数
  $$ 这个程序的PID
  $! 执行上一个背景指令的PID
  $? 上一个指令的返回值

比较运算符

文件比较运算符

-e filename         如果 filename 存在,则为真        [ -e /var/log/syslog ]
-d filename        
如果 filename 为目录,则为真        [ -d /tmp/mydir ]
-f filename        
如果 filename 为常规文件,则为真        [ -f /usr/bin/grep ]
-L filename        
如果 filename 为符号链接,则为真        [ -L /usr/bin/grep ]
-r filename        
如果 filename 可读,则为真        [ -r /var/log/syslog ]
-w filename        
如果 filename 可写,则为真        [ -w /var/mytmp.txt ]
-x filename        
如果 filename 可执行,则为真        [ -L /usr/bin/grep ]
filename1 -nt filename2        
如果 filename1 filename2 新,则为真        [ /tmp/install/etc/services -nt/etc/services ]
filename1 -ot filename2        
如果 filename1 filename2 旧,则为真        [ /boot/bzImage -otarch/i386/boot/bzImage ]

 

字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)

-z string         如果 string 长度为零,则为真        [ -z "$myvar" ]
-n string        
如果 string 长度非零,则为真        [ -n "$myvar" ]
string1 = string2       
如果 string1 string2 相同,则为真        [ "$myvar" = "onetwo three" ]
string1 != string2       
如果 string1 string2 不同,则为真        [ "$myvar" !="one two three" ]

 

算术比较运算符

num1 -eq num2        等于        [ 3 -eq $mynum ]
num1 -ne num2       
不等于       [ 3 -ne $mynum ]
num1 -lt num2       
小于       [ 3 -lt $mynum ]
num1 -le num2       
小于或等于       [ 3 -le $mynum ]
num1 -gt num2       
大于       [ 3 -gt $mynum ]

num1 -ge num2        大于或等于        [ 3 -ge $mynum ]

Shell文本操作

Find查找命令的使用

find . -name "*.text"      //在当前目录下查找已txt为后缀的文件

fing .-name "[a-z]*"      //在当前目录下查找开头字母的文件

find /etc -name "host*"    //查找/etc目录下以host开头的文件

find . -perm 755        //在当前目录下查找属性为755的文件

find -user root        //在当前目录下查找属主为root的文件

find /var -mtime -5      ///var下查找更改时间在5天内的文件

find /var -mtime +3      ///var下查找更改时间在3天以前的文件

find /etc -type d        //查找文件类型为d的目录文件

find /etc -typt l        //查找文件类型为l的链接文件

find . -size +1000000c     //查找文件大小在1M的文件

正则表达式

^linux        //linux开头的

$php        //php结尾的

.          //匹配任意单字符

.+          //匹配任意多个字符

.*          //匹配0个或多个字符

[0-9a-z]       //匹配[]内任意一个字符

(linux)+        //出现多次linux单词

(web){2}       //web出现了2次以上

\          //转译

grep详解

grep "li qq"*          //在所有文件中查找li qq文件

grep -c "file" a          //在文件中查找有多少行匹配到file

grep -n "file" a          //在文件中查找有多少行匹配file,同时显示行和行号

grep -i "file" a          //在文件中查找file,并不区分大小写

grep -v "file" a          //在文件中过滤掉file所在的行

grep -E "2017:22:5[0-9]" a     //在文件中查找在时间在2017:22:5059的所在行

grep -E "^[^210]" a        //在文件中查找不号寒210的行

grep -E "h*p" a          //查找包含hp的行

grep -E "[5-8][6-9][0-3]" a    //查找大于560小于893的行

grep -E "^d" a          //在文件中查找以d开头的行

grep -E "^[^d]" a          //在文件中查找不是以d开头的行

awk命令:

简介:awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

格式:awk '{pattern + action}' {filenames}

pattern:查找内容

action:匹配规则

awk '{pring $0}' access.log              //查找文件中的每一列

awk '{print $1"\t"$7}' access.log           //查找文件中第一列和第七列

cat file | awk '$0 !~ /192.168.31.25/'|grep "php"    //匹配Ip 地址的统计,!~为不匹配

例:for i in `cat /etc/passwd | head | awk -F:'{print $1}'`

do

echo $i

done

-F---以什么符号分割

head---去前多少行,默认是10

sed行定位使用

简介:sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。

选项

功能

-e

进行多项编辑,即对输入行应用多条sed命令时使用

-n

取消默认的输出

-f

指定sed脚本的文件名

sed -n '2'p file        //只打印第二行,不打印其他行

sed -n '1,4'p file       //从第一行到第四行的记录

sed -n '/los/'p file      //打印匹配los的行

sed -n '4,/los/'p file     //打印从第四行到匹配los的之间所有行

sed '1,2'd file        //吧第一行和第二行全部删除

Uniq行定位使用

简介:uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用。

语法 uniq(选项)(参数)

选项

-c——count:在每列旁边显示该行重复出现的次数;

-d--repeated:仅显示重复出现的行列;

-f<栏位>--skip-fields=<栏位>:忽略比较指定的栏位;

-s<字符位置>--skip-chars=<字符位置>:忽略比较指定的字符;

-u——unique:仅显示出一次的行列;

-w<字符位置>--check-chars=<字符位置>:指定要比较的字符。

uniq -c file          //打印紧挨的重复行出现的次数

uniq -d file          //只打印重复的行

awk '{print $1}' /var/log/httpd/access_log | sort|uniq -c        //apache网站的所有访问ip全部统计出来,并打印出统计次数。

spli行定位

简介:可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志。

语法:split(选项)(filePREFIX

选项:

-b:值为每一输出档案的大小,单位为 byte

-C:每一输出档中,单行的最大 byte 数。

-d:使用数字作为后缀。

-l:值为每一输出档的列数大小。
          PREFIX:代表前导符,可作为切割文件的前导文件。

split -2 file spt        //生成fileab,fileac....fileai等多个文件,把a文件每行分割成一个文件,每个文件的前缀都是以file开头的。

posted @ 2019-11-17 14:48  LXZ~AIU  阅读(119)  评论(0)    收藏  举报