Linux下的shell編程(三)BY 四喜三順

 

正則表達式:
-------------------------------------------------------------------------------------------
^        行起始                ^tux        匹配以tux起始的行
$        行結尾                tux$        匹配以tux結尾的行
.        匹配任意字符            Hack.        匹配Hack一、Hacki,但不匹配Hack12或Hackij,只匹配單個字符
[]        匹配[]內1個字符        coo[kl]        匹配cook或者cool
[^]        匹配[]之外1個字符        9[^01]        匹配9二、93等,不匹配91和90
[-]        匹配[-]內1個字符        [1-5]        匹配一、二、三、四、5
?        匹配以前項1次或0次        colou?r        匹配colour或者color
+        匹配以前項1次或屢次        roll-9+        匹配roll-九、roll-9九、roll-999等
*        匹配以前項0次或屢次        co*l        匹配cl、col、cool、coool等
()        建立1個用於匹配的字串    max(tri)?    匹配maxtri或者max
{n}        匹配以前項n次            [0-9]{3}    匹配任意1個3位數
{n,}    至少匹配n次            [0-9]{2,}    匹配任意1個2位數或更多位數
{n,m}    匹配最小n次,最大m次    [0-9]{2,5}    匹配從2位數到5位數之間任意1個數字
|        匹配|兩邊任一項        O(1st|2nd)    匹配O1st或者O2nd
\        轉義符                a\.b        匹配a.b,但不匹配aib、akb等,忽略了.的意義
-------------------------------------------------------------------------------------------
[:alnum:]    字母與數字
[:alpha:]    字母(含大寫小寫)
[:lower:]    小寫字母
[:upper:]    大寫字母
[:digit:]    數字
[:blank:]    空格與製表符
[:punct:]    標點符號
[:space:]    包括換行符、回車等在內的全部空白字符
-------------------------------------------------------------------------------------------
\b    單詞邊界        \bcool\b匹配cool
\B    非單詞邊界    cool\B不匹配cool,能夠匹配coolant
\d    [0-9]
\D    [^0-9]
\w    [0-9a-zA-Z_]
\W    [^0-9a-zA-Z_]
\n    匹配1個新行
\r    匹配回車
\s    匹配單個空白字符
\S    匹配單個非空白字符
-------------------------------------------------------------------------------------------
例如:電子郵件地址的正則表達式 [A-Za-z0-9.]+@[A-Za-z0-9.]+\.[a-zA-Z]{2,4}

grep的用法:
(1)查找
$ grep "matchtext" file1 file2 ...        #在file一、file2等文件中查找matchtext
$ grep -E "[a-z]" file1 file2...        #正則表達式,在file一、file2等文件中查找小寫字母
$ egrep "[a-z]" file1 file2...            #正則表達式,在file一、file2等文件中查找小寫字母
(2)在多級目錄中對文本進行搜索
$ grep "text" . -R -n    #對當前目錄查找
例:    $ cd src_dir
    $ grep "test_function()" . -R -n
    ./miscutils/test.c:16:test_function()
意爲test_function()在miscutils/test.c的第16行
(3)同時匹配多個樣式
$ grep -e "pattern1" -e "pattern2"
$ grep -f pattern_file source_file    #先在pattern_file中逐行寫下須要匹配的樣式
(4)搜索中包括或者排除文件遞歸搜索
$ grep "main()" . -r --include *.{c,cpp}    #在當前目錄中只遞歸搜索全部的c和cpp文件
$ grep "main()" . -r --exclude "README"        #在搜索中排除全部的README文件
$ grep "main()" . -r --exclude-dir             #在搜索中排除目錄
(5)靜默輸出
看下面的腳本:
--------------------------------------------------------
#! /bin/bash
# grep.sh

if [ $# -ne 2 ];
then
echo "$0 match_text filenameaaaa"
fi

match_text=$1
filename=$2

grep -q $match_text $filename    #成功返回0,不成功返回非0值

if [ $? -eq 0 ];
then
echo "The text exists in the file"
else
echo "The text does not exist in the file"
fi
---------------------------------------------------------
運行時:$ ./grep.sh "Obama" USA_news.txt

sed用法:
(1)替換給定文本,從stdin中讀取
$ sed 's/pattern/replace_string/' file
$ cat file | sed 's/pattern/replace_string/' file
(2)替換給定文本,寫入到原文件
$ sed -i 's/pattern/replace_string/' file
(3)替換給定文本,寫入到新文件
$ sed 's/pattern/replace_string/' file > newfile

以上(1)(2)(3)只會將每一行的第一個pattern替換掉,若是想替換所有,需加上參數g
$ sed 's/pattern/replace_string/g' file
若是要從第N個pattern開始替換,則:
$ sed 's/pattern/replace_string/Ng' file

's/pattern/replace_string/' 也能夠寫成's:pattern:replace_string:'或's|pattern|replace_string|'
須要主義的是,若是pattern自己內部有|或者:等的時候,須要轉義符,如:sed 's|te\|xt|replace|g'

移除空白行:    $ sed '/^$/d' file        #空白行的正則表達式是^$
移除匹配樣式的行:    $ sed '/pattern/d' file
用&標記匹配樣式字符串:$ cat file | sed 's/\w\+/[&]/g' file    #這裏正則表達式\w\+匹配每個單詞,用[&]替換它,&表明匹配的單詞

例題:輸入dkdkkiaoiqqiwideiujdiwd,統計每一個字母出現字數並按字母表排序
INPUT="dkdkkiaoiqqiwideiujdiwd"
OUTPUT=`echo $INPUT | sed 's/[^n]/&\n/g' | sed '/^$/d' | sort | uniq -c | tr -d ' \n' `
echo $OUTPUT
結果爲:1a5d1e6i1j3k1o2q1u2w
其中:
sed 's/[^n]/&\n/g'     #在每一個字符後追加1個換行符,使得每行只出現一個字符
sed '/^$/d'         #最後1個字符會被sed替換成「字符+\n」,因此多出1個換行符並在最後造成1個空行,這個命令刪除最後的空行
sort                #排序
uniq -c                #打印出每行各重複了多少次
tr -d ' \n'            #刪除空格和換行符,造成最終結果

awk用法:
awk 'BEGIN{print "start"} pattern{commands} END{print "end"}' filename
即由3部分組成,BEGIN、END、可以使用模式匹配的通用語句塊,3部分可選
機制爲:第一步執行BEGIN中的語句;第二步從文件中讀取1行,執行pattern{commands},重複這個過程直至文件所有讀取完畢;第三步執行END中的語句。
如:$ awk 'BEGIN {i=0} {i++} END {print i}' filename        #統計filename文件的行數
更常見的形式是 awk 'pattern{commands}' filename  #pattern 表示 AWK 在數據中查找的內容,而 commands 是在找到匹配內容時所執行的一系列命令。

awk的特殊變量:
NR    記錄行號
NF    記錄字段數
$0    當前行的文字內容
$1    第一個字段的文本內容
$2    第二個字段的文本內容
示例:
$ echo "line1 f2 f3"|awk '{print "Line number:"NR}'
Line number:1
$ echo "line1 f2 f3"|awk '{print "Number of fields:"NF}'
Number of fields:3
$ echo "line1 f2 f3"|awk '{print "$2="$2}'
$2=f2
$ echo "line1 f2 f3"|awk '{print "$3="$3}'
$3=f3

打印文件每一行的第三和第二個單詞:    $ awk '{print $3 $2}' filename
統計文件行數:    $ awk 'END{print NR}' filename


wget用法:
例如網站下載
$ wget http://att.newsmth.net/att.php?p.1349.56166.262.jpg
$ xdg-open att.php\?p.1349.56166.262.jpg
爬蟲技術:
$ wget -r -N -l DEPTH URL
其中:-r表明遞歸下載,-N表明容許對文件使用時間戳,-l DEPTH指定頁面層級

lynx用法:
lynx是純文本的瀏覽器,但利用lynx指令能夠將它的純文本格式輸出做爲網頁來獲取
下面的命令將網頁以ASCII字符的形式下載到文本文件中
$ lynx -dump URL > plain_text_page.txt

curl用法:
$ curl URL            #下載
$ curl URL --silent        #下載,不顯示進度信息
$ curl URL --silent -o        #下載,不顯示進度信息,將下載數據寫入文件,而不是寫入標準輸出
$ curl URL --silent -o new_filename        #下載,不顯示進度信息,將下載數據寫入新的文件
$ curl URL --silent -o new_filename --progress        #下載,不顯示進度信息,將下載數據寫入新的文件,下載過程顯示進度條
$ curl URL --max-filesize bytes    #指定最大下載量
$ curl -u user:pass URL        #指定用戶名密碼
$ curl -u user URL            #指定用戶名,須要密碼提示

綜合練習:製做圖片抓取器及下載工具
---------------------------------------------------------------------------------------------
00    #! /bin/bash
01    # downloader.sh
02
03    if [ $# -ne 3 ];
04    then
05        echo "Usage: $0 URL -d DIRECTORY"
06        exit -1
07    fi
08
09    for i in {1..4}
10    do
11        case $1 in
12        -d) shift; directory=$1; shift ;;
13        *) url=${url:-$1}; shift;;
14    esac
15    done
16
17    mkdir -p $directory;
18    baseurl=$(echo $url | egrep -o "https?://[a-z.]+")
19
20    curl -s $url | egrep -o "<img src=[^>]*>"|sed 's/<img src=\"\([^"]*\).*/\1/g' > /tmp/$$.list
21
22    sed -i "s|^/|$baseurl/|" /tmp/$$.list
23
24    cd $directory;
25
26    while read filename;
27    do
28        curl -s -O "$filename" --silent
29
30    done < /tmp/$$.list
------------------------------------------------------------------------------------------------
解析:
(1)$# 表明添加到Shell的參數個數;$0 表明Shell自己的文件名;$1是第1參數、$2是第2參數……
(2)第3-7行意爲,判斷命令行參數是否是3個,若是不是,退出,並打印出用法提示
(3)shift命令用於左移。好比shift 3表示原來的$4如今變成$1,原來的$5如今變成$2等等,原來的$一、$二、$3丟棄,$0不移動。不帶參數的shift命令至關於shift 1。
(4)第12行意爲,對第一個參數$1求值,以匹配-d等被檢查到的字符串參數,咱們能夠寫成 $ ./downloader.sh -d DIR URL 或者 $ ./downloader.sh URL -d DIR等。使用shift後,$2值賦給$1,再使用shift,$3值賦給$1,以此類推,所以咱們經過$1就能夠對全部的參數進行求值。
(5)第13行意爲,*)對於默認值,在這裏可以匹配除了-d之外的任意內容。若是實際狀況是$1=" "或$1=URL,咱們須要採用$1=URL,因此咱們使用url=${url:-$1},若是url不爲空,返回URL值,不然,返回$1的值
(6)第20行,egrep -o "<img src=[^>]*>"只打印包括屬性值在內的<img>標記,[^>]*用來匹配除了>之外的全部字符
(7)第20行,sed 's/<img src=\"\([^"]*\).*/\1/g'對src="url"進行解析,從已經解析出來的<img>中獲得全部的圖像文件URL
(8)第22行,因爲圖像文件有絕對路徑(如http://example.com/image.jpg)和相對路徑(/image.jpg),對於後者,以/開頭,須要用基址URL(base URL)把它轉換成http://example.com/image.jpg,用第22行把全部的/替換成baseurl
(9)第26行,while對圖片的URL列表進行逐行迭代,並用curl下載圖像文件

其餘管理類命令:
$ du filename        #列出filename文件佔用的磁盤空間,du表明disk usage
$ df                 #列出磁盤空餘狀況,df表明disk free
$ time command        #執行指令,並列出指令運行時間
$ who                #獲取當前登陸用戶的相關信息
$ w                    #獲取當前登陸用戶的相關信息
$ ps                #收集系統中進程的詳細信息,包括PID等
$ which    command        #找出某個命令的位置
$ whereis command    #找出某個命令的位置,並打印出其對應的命令手冊的位置以及命令源代碼的路徑(若是有)
$ file filename        #肯定文件類型
$ whatis command    #輸出做爲參數的命令的簡短描述信息

php

相關文章
相關標籤/搜索