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開頭的。

相關文章
相關標籤/搜索