0:首先要了解的正則表達式知識(跟php的正則表達式風格類似)
^ 行首標識
$ 篇尾標識或行尾標識
. 代表任意一個字符
? 代表前趨字符的一次出現
* 代表0個或多個前趨字符出現
[1-9] 代表一個屬於1-9的字符
[^1-9] 代表一個不包含於1-9的字符
/< 詞首標識
/> 詞尾標識 x/{m,n/} 代表x的至少m次,至多n次出現/( /) 引用標識,可以多次引用,並在後面以/1 /2來引用
1 grep命令
通用格式 grep [option] regx file
常用示例:
grep -i ‘yyy’ /etc/passwd 不區分大小寫顯示文件中有yyy的行
grep -v ‘^yyy’ /etc/passwd 顯示文件中開關不是yyy和行
grep -n ‘yyy’ /etc/passwd 顯示文件中含有yyy的行,且打印此行在文件中的行號
grep -lr ‘$yyy’ /etc 遞歸查找/etc下包含行結尾為yyy的文件名
grep -Lr ‘yyy’ /etc 遞歸查找/etc下文件中不包含yyy的文件名
grep -c ‘yyy’ /etc/passwd 統計文件中yyy出現的行數
2 awk
通用格式:gawk ‘pattern {action}’ file
cmd | gawk ‘pattern {action}’
如果沒有pattern,則對所有行都采用action,如果沒有action,則打印匹配行。在pattern中可以使用各種定義的變量$0,,NF,NR等.
工作原理:awk 掃描一行,放入變量$0中,然後行被分隔成各個域,以指定的分隔符進行分離,默認為空格,可以通過參數FS指定。各個域都存於變量$i中,至多100個域。
gawk -F : ‘{print $1}’ /etc/passwd 打印所有用戶名
格式化輸出:
print 支持使用轉義字符,及OFMT變量定義的輸出數字格式
nawk ‘/Sally/{print “/t/tHave a nice day, ” $1, $2 “/!”}’ employees
nawk ‘BEGIN{OFMT=”%.2f”; print 1.2456789, 12E 2}’
printf支持C語言同名函數的所有功能
echo “UNIX” | nawk ‘ {printf “|%-15s|/n”, $1}’
nawk ‘{printf “The name is: %-15s ID is %8d/n”, $1, $3}’ employees
域分隔符:
nawk F'[ :/t]’ ‘{print $1, $2, $3}’ employees
pattern
pattern{ action statement; action statement; etc. }
pattern可以是正則表達式,也可以是條件表達式,條件表達式甚至可以進行數學運算
~ 匹配運算 nawk ‘$1 !~ /ly$/’ employees
比較表達式:支持==,>=,<=,!=,~,!~等各種比較操作,並支持&&,||等邏輯表達式連接多個比較表達式。
awk ‘$3 * $4 > 500′ filename
范圍模式:
awk ‘/Tom/,/Suzanne/’ filename
Action
{}中的Action的極其類似C語言的子句,裡面可以嵌套子句,可以使用條件、循環、支持變量函數定義、使用自定義或內部變量、內部函數,調用系統命令,輸入輸出重定向等強大的能力。
變量:var=value,若變量沒有初始化,字符串為””,數字為0。
nawk ‘$1 ~ /Tom/ {wage = $2 * $3; print wage}’ filename
內置變量:
ARGC Number of command-line argument
ARGIND Index in ARGV of the current file being processed from the command line (gawk only)
ARGV Array of command-line arguments
CONVFMT Conversion format for numbers, %.6g, by default (gawk only)
ENVIRON An array containing the values of the current environment variables passed in from the shell
ERRNO Contains a string describing a system error occurring from redirection when reading from the getline function or when using the close function (gawk only)
FIELDWIDTHS A whitespace-separated list of fieldwidths used instead of FS when splitting records of fixed fieldwidth (gawk only)
FILENAME Name of current input file
FNR Record number in current file
FS The input field separator, by default a space
IGNORECASE Turns off case sensitivity in regular expressions and string operations (gawk only)
NF 當前記錄的域個數,$NF可以引用到最後一個域
NR 當前的記錄序號
OFMT Output format for numbers
OFS Output field separator
ORS Output record separator
RLENGTH Length of string matched by match function
RS Input record separator
RSTART Offset of string matched by match function
RT The record terminator; gawk sets it to the input text that matched the character or regex specified by RS
SUBSEP Subscript separator
BEGIN模式後跟的ACTION,表示在awk處理文本以前進行的動作,可以用來初始化各種內部變量,或其他動作。
END 模式後跟的ACTION,表示在awk處理結束後進行的動作。
重定向:
nawk ‘$4 >= 70 {print $1, $2 > “passing_file” }’ filename
nawk ‘BEGIN{while(“ls” | getline) print}’
條件語句
{if ( $3 > 89 && $3 < 101 ) Agrade++
else if ( $3 > 79 ) Bgrade++
else if ( $3 > 69 ) Cgrade++
else if ( $3 > 59 ) Dgrade++
else Fgrade++
}
循環:支持while,for的的標准循環結構及break,continue等。
{
for ( x = 3; x <= NF; x++ )
if ( $x == 0 ) { print “Get next item”; continue}
}
數組:awk的數組是map類型的,索引可以是數字也可是字符串。同時支持多維數組。
nawk ‘{id[NR]=$3};END{for(x = 1; x <= NR; x++) print id[x]}’ employees
nawk ‘/^Tom/{name[NR]=$1};END{for(i in name){print name[i]}}’ db
nawk ‘{count[$2]++}END{for(name in count)print name,count[name] }’ datafile4
split(string,array,FS) 按照分隔符FS將string分成多個域放在array中。
內置函數:
(g)sub(regx,string,[tstring]) (在tstring位置處)將regx的第一次(全部)出現替換為string。
index(string,substr) 返回子串的位置
length(string) 返回字串的長度
substr(string,start,[len]) 返回start開始長為len的串
match(string,regx) 返回正則表達式在string中的匹配位置
sprintf() 返回指定格式的串
awk ‘{line = sprintf ( “% 15s %6.2f “, $1 , $3 ); print line}’ filename
sin cos exp int log rand atan2 sqrt srand等
求子串經常用來格式化具有固定長但沒有分隔符的域。而gsub通常用來替換某些無用的字符,使用替換後字符串更有意義。
自定義函數:
function name ( parameter, parameter, parameter, … )
{
statements
return expression
}
3 find
命令格式: find [選項] [路徑] [表達式]
find的選項只有三個P,L,H,是用來控制是否需要follow鏈接文件,-P表示不follow,-L表示follow,-H表示當鏈接出現在[路徑]中時才follow,否則不follow
[路徑]表示find查找的目錄,如果為空則默認為當前目錄
find使用的技巧在於使用好[表達式],表達式可以指定查找特定文件名、特定時間訪問或修改的文件、特定大於的文件、名字符合特定正則表達式的文件等等等
find可以後面啟用多個表達式,多個表達式間可以使用-and -or 或-not連接
一個完整的表達由三部分構成: [選項] [測試] [執行動作]
示例: find /tmp -maxdepth 1 -name “*.log” -exec cat {} \; 其中-maxdepth 1為選項,-name “*.log”為測試條件,-exec…是動作