Shell脚本编程

 

Shell脚本编程学习记录php

说明

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

Shell环境

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

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.shshell

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

  #Program:     //程序内容说明编程

  #History:     //时间和做者vim

Shell变量

使用变量

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

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开头的。

相关文章
相关标签/搜索