欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

2.3.1.shellawk入門

awk:好用的數(shù)據(jù)處理工具

10多年的滄縣網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整滄縣建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“滄縣網(wǎng)站設(shè)計(jì)”,“滄縣網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

 

awk 也是一個(gè)非常棒的數(shù)據(jù)處理工具!sed 常常用于一整個(gè)行的處理, awk 則比較傾向于一行當(dāng)中分成數(shù)個(gè)『欄位』(或者稱為一個(gè)域,也就是一列)來(lái)處理。因此,awk 相當(dāng)?shù)倪m合處理小型的數(shù)據(jù)數(shù)據(jù)處理呢!awk 通常運(yùn)行的模式是這樣的:

[root@www ~]# awk '條件類型1{動(dòng)作1} 條件類型2{動(dòng)作2} ...' filename


awk 后面接兩個(gè)單引號(hào)并加上大括號(hào) {} 來(lái)配置想要對(duì)數(shù)據(jù)進(jìn)行的處理動(dòng)作。 awk 可以處理后續(xù)接的文件,也可以讀取來(lái)自前個(gè)命令的 standard output 。 但如前面說(shuō)的, awk 主要是處理『每一行的欄位內(nèi)的數(shù)據(jù)』,而默認(rèn)的『欄位的分隔符號(hào)為 "空白鍵" 或 "[tab]鍵" 』!舉例來(lái)說(shuō),我們用 last 可以將登陸者的數(shù)據(jù)取出來(lái),結(jié)果如下所示:

[root@www ~]# last -n 5 <==僅取出前五行
root     pts/1   192.168.1.100  Tue Feb 10 11:21   still logged in
root     pts/1   192.168.1.100  Tue Feb 10 00:46 - 02:28  (01:41)
root     pts/1   192.168.1.100  Mon Feb  9 11:41 - 18:30  (06:48)
dmtsai   pts/1   192.168.1.100  Mon Feb  9 11:41 - 11:41  (00:00)
root     tty1                   Fri Sep  5 14:09 - 14:10  (00:01)

若我想要取出帳號(hào)與登陸者的 IP ,且?guī)ぬ?hào)與 IP 之間以 [tab] 隔開(kāi),則會(huì)變成這樣:

[root@www ~]# last -n 5 | awk '{print $1 "\t" $3}'
root    192.168.1.100
root    192.168.1.100
root    192.168.1.100
dmtsai  192.168.1.100
root    Fri

上表是 awk 最常使用的動(dòng)作!透過(guò) print 的功能將欄位數(shù)據(jù)列出來(lái)!欄位的分隔則以空白鍵或 [tab] 按鍵來(lái)隔開(kāi)。 因?yàn)椴徽撃囊恍形叶家幚恚虼耍筒恍枰?"條件類型" 的限制!我所想要的是第一欄以及第三欄, 但是,第五行的內(nèi)容怪怪的~這是因?yàn)閿?shù)據(jù)格式的問(wèn)題啊!所以羅~使用 awk 的時(shí)候,請(qǐng)先確認(rèn)一下你的數(shù)據(jù)當(dāng)中,如果是連續(xù)性的數(shù)據(jù),請(qǐng)不要有空格或 [tab] 在內(nèi),否則,就會(huì)像這個(gè)例子這樣,會(huì)發(fā)生誤判喔!

另外,由上面這個(gè)例子你也會(huì)知道,在每一行的每個(gè)欄位都是有變量名稱的,那就是 $1, $2... 等變量名稱。以上面的例子來(lái)說(shuō), root 是 $1 ,因?yàn)樗堑谝粰诼铮≈领?192.168.1.100 是第三欄, 所以他就是 $3 啦!后面以此類推~呵呵!還有個(gè)變量喔!那就是 $0 ,$0 代表『一整列數(shù)據(jù)』的意思~以上面的例子來(lái)說(shuō),第一行的 $0 代表的就是『root .... 』那一行啊! 由此可知,剛剛上面五行當(dāng)中,整個(gè) awk 的處理流程是:

  1. 讀入第一行,并將第一行的數(shù)據(jù)填入 $0, $1, $2.... 等變量當(dāng)中;

  2. 依據(jù) "條件類型" 的限制,判斷是否需要進(jìn)行后面的 "動(dòng)作";

  3. 做完所有的動(dòng)作與條件類型;

  4. 若還有后續(xù)的『行』的數(shù)據(jù),則重復(fù)上面 1~3 的步驟,直到所有的數(shù)據(jù)都讀完為止。

經(jīng)過(guò)這樣的步驟,你會(huì)曉得, awk 是『以行為一次處理的單位』, 而『以欄位為最小的處理單位』。好了,那么 awk 怎么知道我到底這個(gè)數(shù)據(jù)有幾行?有幾欄呢?這就需要 awk 的內(nèi)建變量的幫忙啦~

變量名稱代表意義
NF每一行 ($0) 擁有的欄位總數(shù)
NR目前 awk 所處理的是『第幾行』數(shù)據(jù)
FS目前的分隔字節(jié),默認(rèn)是空白鍵


我們繼續(xù)以上面 last -n 5 的例子來(lái)做說(shuō)明,如果我想要:

  • 列出每一行的帳號(hào)(就是 $1);

  • 列出目前處理的行數(shù)(就是 awk 內(nèi)的 NR 變量)

  • 并且說(shuō)明,該行有多少欄位(就是 awk 內(nèi)的 NF 變量)

則可以這樣:

Tips:
要注意喔,awk 后續(xù)的所有動(dòng)作是以單引號(hào)『 ' 』括住的,由於單引號(hào)與雙引號(hào)都必須是成對(duì)的, 所以, awk 的格式內(nèi)容如果想要以 print 列印時(shí),記得非變量的文字部分,包含上一小節(jié) printf 提到的格式中,都需要使用雙引號(hào)來(lái)定義出來(lái)喔!因?yàn)閱我?hào)已經(jīng)是 awk 的命令固定用法了!
[root@www ~]# last -n 5| awk '{print $1 "\t lines: " NR "\t columns: " NF}'
root     lines: 1        columns: 10
root     lines: 2        columns: 10
root     lines: 3        columns: 10
dmtsai   lines: 4        columns: 10
root     lines: 5        columns: 9
# 注意喔,在 awk 內(nèi)的 NR, NF 等變量要用大寫(xiě),且不需要有錢字號(hào) $ 啦!

 

這樣可以了解 NR 與 NF 的差別了吧?好了,底下來(lái)談一談所謂的 "條件類型" 了吧!

注:$0 表示整行,$1 代表第一項(xiàng)

 


  • awk 的邏輯運(yùn)算字節(jié)

既然有需要用到 "條件" 的類別,自然就需要一些邏輯運(yùn)算羅~例如底下這些:

運(yùn)算單元代表意義
>大於
<小於
>=大於或等於
<=小於或等於
==等於
!=不等於

值得注意的是那個(gè)『 == 』的符號(hào),因?yàn)椋?/p>

  • 邏輯運(yùn)算上面亦即所謂的大於、小於、等於等判斷式上面,習(xí)慣上是以『 == 』來(lái)表示;

  • 如果是直接給予一個(gè)值,例如變量配置時(shí),就直接使用 = 而已。

好了,我們實(shí)際來(lái)運(yùn)用一下邏輯判斷吧!舉例來(lái)說(shuō),在 /etc/passwd 當(dāng)中是以冒號(hào) ":" 來(lái)作為欄位的分隔, 該文件中第一欄位為帳號(hào),第三欄位則是 UID。那假設(shè)我要查閱,第三欄小於 10 以下的數(shù)據(jù),并且僅列出帳號(hào)與第三欄, 那么可以這樣做:

[root@wuke ~]# cat /etc/passwd | \

> awk '{FS=":"}$3<10{print $1 "\t" $3}'

root:x:0:0:root:/root:/bin/bash

bin1

daemon2

adm3

lp4

sync5

shutdown6

halt7

mail8

有趣吧!不過(guò),怎么第一行沒(méi)有正確的顯示出來(lái)呢?這是因?yàn)槲覀冏x入第一行的時(shí)候,那些變量 $1, $2... 默認(rèn)還是以空白鍵為分隔的,所以雖然我們定義了 FS=":" 了, 但是卻僅能在第二行后才開(kāi)始生效。那么怎么辦呢?我們可以預(yù)先配置 awk 的變量啊! 利用 BEGIN 這個(gè)關(guān)鍵字喔!這樣做:

[root@wuke ~]# cat /etc/passwd | \

> awk 'BEGIN{FS=":"}$3<10{print $1 "\t" $3}'

root0

bin1

daemon2

adm3

lp4

sync5

shutdown6

halt7

mail8

很有趣吧!而除了 BEGIN 之外,我們還有 END 呢!另外,如果要用 awk 來(lái)進(jìn)行『計(jì)算功能』呢?以底下的例子來(lái)看, 假設(shè)我有一個(gè)薪資數(shù)據(jù)表檔名為 pay.txt ,內(nèi)容是這樣的:

Name    1st     2nd     3th
VBird   23000   24000   25000
DMTsai  21000   20000   23000
Bird2   43000   42000   41000

如何幫我計(jì)算每個(gè)人的總額呢?而且我還想要格式化輸出喔!我們可以這樣考慮:

  • 第一行只是說(shuō)明,所以第一行不要進(jìn)行加總 (NR==1 時(shí)處理);

  • 第二行以后就會(huì)有加總的情況出現(xiàn) (NR>=2 以后處理)

[root@wuke shell]# cat pay.txt | \
> awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}
> NR>=2{total=$2+$3+$4
> printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4,total}'
      Name        1st        2nd        3th      Total
     VBird      23000      24000      25000   72000.00
    DMTsai      21000      20000      23000   64000.00
     Bird2      43000      42000      41000  126000.00
     
     上面的例子有幾個(gè)重要事項(xiàng)應(yīng)該要先說(shuō)明的:
awk 的命令間隔:所有 awk 的動(dòng)作,亦即在 {} 內(nèi)的動(dòng)作,如果有需要多個(gè)命令輔助時(shí),可利用分號(hào)『;』間隔, 或者直接以 [Enter] 按鍵來(lái)隔開(kāi)每個(gè)命令,例如上面的范例中,鳥(niǎo)哥共按了三次 [enter] 喔!
邏輯運(yùn)算當(dāng)中,如果是『等於』的情況,則務(wù)必使用兩個(gè)等號(hào)『==』!
格式化輸出時(shí),在 printf 的格式配置當(dāng)中,務(wù)必加上 \n ,才能進(jìn)行分行!
與 bash shell 的變量不同,在 awk 當(dāng)中,變量可以直接使用,不需加上 $ 符號(hào)。
利用 awk 這個(gè)玩意兒,就可以幫我們處理很多日常工作了呢!真是好用的很~ 此外, awk 的輸出格式當(dāng)中,常常會(huì)以 printf 來(lái)輔助,所以, 最好你對(duì) printf 也稍微熟悉一下比較好啦!另外, awk 的動(dòng)作內(nèi) {} 也是支持 if (條件) 的喔! 舉例來(lái)說(shuō),上面的命令可以修訂成為這樣:
[root@wuke shell]# cat pay.txt | \
> awk '{if(NR==1) printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}
> NR>=2{total=$2+$3+$4
> printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4,total}'
      Name        1st        2nd        3th      Total
     VBird      23000      24000      25000   72000.00
    DMTsai      21000      20000      23000   64000.00
     Bird2      43000      42000      41000  126000.00

你可以仔細(xì)的比對(duì)一下上面兩個(gè)輸入有啥不同~從中去了解兩種語(yǔ)法吧!我個(gè)人是比較傾向於使用第一種語(yǔ)法, 因?yàn)闀?huì)比較有統(tǒng)一性啊! ^_^

學(xué)習(xí)了awk的基本知識(shí),現(xiàn)在來(lái)做一些練習(xí)加深一下印象。

假設(shè)我們有這樣一個(gè)待處理的文件"grade.txt":

M.Tansley     05/99     48311     Green     8     40     44

J.Lulu     06/99     48317     green     9     24     26
P.Bunny     02/99     48     Yellow     12     35     28
J.Troll     07/99     4842     Brown-3     12     26     26
L.Tansley     05/99     4712     Brown-2     12     30     28

#打印整個(gè)文件

[root@wuke shell]# awk '{print $0}' grade.txt 

M.Tansley     05/99     48311     Green     8     40     44

J.Lulu     06/99     48317     green     9     24     26

P.Bunny     02/99     48     Yellow     12     35     28

J.Troll     07/99     4842     Brown-3     12     26     26

L.Tansley     05/99     4712     Brown-2     12     30     28

#打印第一和第四個(gè)域

[root@wuke shell]# awk '{print $1,$4}' grade.txt 

M.Tansley Green

J.Lulu green

P.Bunny Yellow

J.Troll Brown-3

L.Tansley Brown-2

#打印表頭

[root@wuke shell]# awk 'BEGIN{print "Name        Belt\n-----------------"}

{print $1,$4}' grade.txt

Name        Belt

-----------------

M.Tansley Green

J.Lulu green

P.Bunny Yellow

J.Troll Brown-3

L.Tansley Brown-2

正則表達(dá)式相關(guān)

 

為使一域號(hào)匹配正則表達(dá)式,使用符號(hào)‘~’后緊跟正則表達(dá)式,也可以用 i f語(yǔ)句。awk中if后面的條件用()括起來(lái)。

#下面代碼打印$4 包含 Brown 的行

[root@wuke shell]# awk '$4~/Brown/{print $0}' grade.txt 

J.Troll     07/99     4842     Brown-3     12     26     26

L.Tansley     05/99     4712     Brown-2     12     30     28

#非精確匹配

[root@wuke shell]# awk '$3~/48/{print $0}' grade.txt 

M.Tansley     05/99     48311     Green     8     40     44

J.Lulu     06/99     48317     green     9     24     26

P.Bunny     02/99     48     Yellow     12     35     28

J.Troll     07/99     4842     Brown-3     12     26     26


#精確匹配

[root@wuke shell]# awk '$3=="48"{print $0}' grade.txt 

P.Bunny     02/99     48     Yellow     12     35     28


#不匹配 使用 ‘!~’

[root@wuke shell]# awk '$0!~/Brown/' grade.txt 

M.Tansley     05/99     48311     Green     8     40     44

J.Lulu     06/99     48317     green     9     24     26

P.Bunny     02/99     48     Yellow     12     35     28


[root@wuke shell]# awk '$4!="Brown-2"{print$0}' grade.txt 

M.Tansley     05/99     48311     Green     8     40     44

J.Lulu     06/99     48317     green     9     24     26

P.Bunny     02/99     48     Yellow     12     35     28

J.Troll     07/99     4842     Brown-3     12     26     26


#小于

[root@wuke shell]# awk '$6<$7{print $0}' grade.txt 

M.Tansley     05/99     48311     Green     8     40     44

J.Lulu     06/99     48317     green     9     24     26

#設(shè)置大小寫(xiě)

[root@wuke shell]# awk '/[Gg]reen/' grade.txt 

M.Tansley     05/99     48311     Green     8     40     44

J.Lulu     06/99     48317     green     9     24     26


#匹配第一個(gè)域的第三個(gè)字符是‘a(chǎn)’

[root@wuke shell]# awk '$1~/^...a/' grade.txt 

M.Tansley     05/99     48311     Green     8     40     44

L.Tansley     05/99     4712     Brown-2     12     30     28

#'或'匹配,使用 ‘|’ ,需使用括號(hào)括起來(lái)

[root@wuke shell]# awk '$0~/(Yellow|Brown)/' grade.txt 

P.Bunny     02/99     48     Yellow     12     35     28

J.Troll     07/99     4842     Brown-3     12     26     26

L.Tansley     05/99     4712     Brown-2     12     30     28


練習(xí):寫(xiě)一個(gè)腳本
      1.設(shè)定變量file的值為/etc/passwd
      2.使用循環(huán)讀取文件/etc/passwd的第2,4,6,10,13,15行,并顯示其內(nèi)容
      3.把這些行保存至/tmp/mypasswd文件中

#! /bin/bash

file="/etc/passwd"

if [ -e /tmp/passwd];then

    b=0

else

    touch /tmp/passwd

fi

for i in 2 4 6 10 13 15

do

exec 3>>/tmp/passwd

line=`head -$i $file|tail -1`

echo "$line"

echo "$line" >&3

exec 3>&-

done


****exec的重定向

  先上我們進(jìn)如/dev/fd/目錄下看一下:

root@localhost:~/test#cd /dev/fd

root@localhost:/dev/fd#ls

0  1  2  255

默認(rèn)會(huì)有這四個(gè)項(xiàng):0是標(biāo)準(zhǔn)輸入,默認(rèn)是鍵盤(pán)。

1是標(biāo)準(zhǔn)輸出,默認(rèn)是屏幕/dev/tty

2是標(biāo)準(zhǔn)錯(cuò)誤,默認(rèn)也是屏幕

255

當(dāng)我們執(zhí)行exec 3>test時(shí):

root@localhost:/dev/fd#exec 3>/root/test/test 

root@localhost:/dev/fd#ls

0  1  2  255  3

root@localhost:/dev/fd#

看到了吧,多了個(gè)3,也就是又增加了一個(gè)設(shè)備,這里也可以體會(huì)下linux設(shè)備即文件的理念。這時(shí)候fd3就相當(dāng)于一個(gè)管道了,重定向到fd3中的文件會(huì)被寫(xiě)在test中關(guān)閉這個(gè)重定向可以用exec 3>&-。

root@localhost:/dev/fd#who >&3

root@localhost:/dev/fd#ls >&3

root@localhost:/dev/fd#exec 3>&-

root@localhost:/dev/fd#cat /root/test/te

test  text  

root@localhost:/dev/fd#cat /root/test/test 

root     tty1         2010-11-16 01:13

root     pts/0        2010-11-15 22:01 (192.168.0.1)

root     pts/2        2010-11-16 01:02 (192.168.0.1)

0

1

2

255

3

每天一個(gè)linux命令(20):find命令之exec

find是我們很常用的一個(gè)Linux命令,但是我們一般查找出來(lái)的并不僅僅是看看而已,還會(huì)有進(jìn)一步的操作,這個(gè)時(shí)候exec的作用就顯現(xiàn)出來(lái)了。 

exec解釋:

-exec  參數(shù)后面跟的是command命令,它的終止是以;為結(jié)束標(biāo)志的,所以這句命令后面的分號(hào)是不可缺少的,考慮到各個(gè)系統(tǒng)中分號(hào)會(huì)有不同的意義,所以前面加反斜杠。

{}   花括號(hào)代表前面find查找出來(lái)的文件名。

使用find時(shí),只要把想要的操作寫(xiě)在一個(gè)文件里,就可以用exec來(lái)配合find查找,很方便的。在有些操作系統(tǒng)中只允許-exec選項(xiàng)執(zhí)行諸如l s或ls -l這樣的命令。大多數(shù)用戶使用這一選項(xiàng)是為了查找舊文件并刪除它們。建議在真正執(zhí)行rm命令刪除文件之前,最好先用ls命令看一下,確認(rèn)它們是所要?jiǎng)h除的文件。 exec選項(xiàng)后面跟隨著所要執(zhí)行的命令或腳本,然后是一對(duì)兒{ },一個(gè)空格和一個(gè)\,最后是一個(gè)分號(hào)。為了使用exec選項(xiàng),必須要同時(shí)使用print選項(xiàng)。如果驗(yàn)證一下find命令,會(huì)發(fā)現(xiàn)該命令只輸出從當(dāng)前路徑起的相對(duì)路徑及文件名。

詳情請(qǐng)查看:http://www.cnblogs.com/peida/archive/2012/11/14/2769248.html

本文參考了一下好的文章:

shell awk 入門

http://www.cnblogs.com/zhuyp1015/archive/2012/07/11/2586985.html

每天一個(gè)linux命令(20):find命令之exec

http://www.cnblogs.com/peida/archive/2012/11/14/2769248.html

標(biāo)題名稱:2.3.1.shellawk入門
本文來(lái)源:http://www.chinadenli.net/article44/iiehhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站全網(wǎng)營(yíng)銷推廣網(wǎng)站改版關(guān)鍵詞優(yōu)化網(wǎng)頁(yè)設(shè)計(jì)公司網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名