awk sed 用法詳解

season0891發表於2009-12-16
版權宣告:原創作品,允許轉載,轉載時請務必以超連結形式標明文章 原始出處 、作者資訊和本宣告。否則將追究法律責任。http://jasonyong.blog.違規廣告.com/47753/202531
AWK:

awk '/'"$IP"'/{print $1}' $tracert_file | grep -v "tracer"
awk 呼叫系統變數'"變數"'
利用shell作變數替換
CODE:
var=abcd
sed:sed -n "/$var/p"   // awk: awk '/'"$var"'/'
num=2
sed: sed -n "${n}p"   //awk: awk 'NR=='"$var"''
#sed要用雙引號,awk變數順序單雙$var雙單
反之:sed/awk將變數傳給shell可以用eval, 如

CODE:
eval $(awk 'BEGIN{print "a=ggg b=3"}')
然後
echo $a;echo $b
測試一下
 
 
[root@test-linux1 shell]# more 1
1:2:3
4:5:6

[root@test-linux1 shell]# awk 'BEGIN{FS=":";OFS="--"}{print $0}' 1
1:2:3
4:5:6
[root@test-linux1 shell]# awk 'BEGIN{FS=":";OFS="--"}$1=$1' 1         
1--2--3
4--5--6
$1=$1可以讓原來的記錄按照你重新設定的變數FS和OFS重新組合。



awk 使用兩個檔案一起查資料
getline函式也不錯:
http://xb9he.blogchina.com/xb9he/6373001.html

awk的變數:
$0           當前一整條記錄
$1-$n        當前記錄的第N欄位
FILENAME     當前檔名
NF           當前記錄的欄位數目
NR           當前記錄的編號(如果是多個檔案就要疊加,下面有例項)
FNR          當前記錄的編號(有多個檔案,不疊加)
FS           記錄的欄位分割符(-F引數同作用)
OFS          輸出內容的欄位分隔符
RS           輸入內容的記錄分隔符
ORS          輸出內容的記錄分隔符
ARGC         命令列引數的個數
ARGIND       命令列中檔案序號
ARGV         命令列引數陣列


awk 中NR和FNR的區別
awk '{print NR,$0}' 1 2
[root@linux-test1 test]# awk '{print NR,$0}' haha.txt test.txt
1 1 a
2 2 b
3 3 d
4 4 c
5 5 e
6 6 f
7 a 2000
8 b 3000
9 c 1000
10 d 3400
11 e 1232
12 f 3213
NR:到此為止的記錄數

awk '{print FNR,$0}' 1 2
[root@linux-test1 test]# awk '{print FNR,$0}' haha.txt test.txt
1 1 a
2 2 b
3 3 d
4 4 c
5 5 e
6 6 f
1 a 2000
2 b 3000
3 c 1000
4 d 3400
5 e 1232
6 f 3213
FNR:當前檔案的記錄數

awk -F'[()]'
awk 的分割符為“(”或者“)”,以前笨得只會用BEGIN。記住了。

awk -F: '{a[$7]++}END{for(i in a)print i,a[i]}' passwd
寫個陣列的例子,防止忘記

awk '{if($1 ~ /^132.*/ )print $0}' test.txt
如果$1是以132開頭,那麼列印出這行

awk一個常用的函式:
length(str)  返回str的字元個數;如果不帶引數,返回當前記錄的字元個數
int(num)     返回整數部分
index(str1,str2)  返回str2在str1中的位置
split(str,arr,del) 以del為分隔符,將str字串拆分成陣列放入到@arr中,返回元素個數
sprintf(fmt,args)  模仿C中的同名函式
substr(str,pos,len) 返回str中從pos開始長度為len個字元的字串
tolower(str)        將所有大寫字母變成小寫
toupper(str)        將所有小寫字母變成大寫


列印記錄的最後一個欄位:
awk '{print $NF}' passwd

列印最後一行:
awk 'END{print}' passwd

列印最後三行:(如果再多要一些,就多加幾個元素就可以了)
awk -F: 'BEGIN{OFS="\n"}{a[0]=a[1];a[1]=a[2];a[2]=$0}END{print a[0],a[1],a[2]}' passwd

列印最後三行的最後一個欄位:
awk -F: 'BEGIN{OFS="\n"}{a[0]=a[1];a[1]=a[2];a[2]=$NF}END{print a[0],a[1],a[2]}' passwd


SED:

sed '/IP\|ADDR\|NETMASK/n'
sed 的多個條件


替換2,5行:
sed '2,5 c\           ## \是換車,也就是換行字元
asdjfl\
asdlfj\
asdf\
asdf' passwd

不列印第5行:
sed '5 !p' passwd  或者   sed '5 n;p' passwd

在行首插入一個字元:
sed 's/^/#/' passwd  或者  sed 's/^./#&/' passwd  ## 注意,不要少了&符號


關於sed的pattern區和hold區:
這兩個概念,說實話,我看明白了兩次(可能),但是不久就會忘記。原因是:1,概念我覺得比較難理解;2,不常用到(我現在實際還沒有用到過。)3,幾個指令太容易記混了

sed有兩個緩衝區,所有命令都工作在Pattern區上,其中保留著sed剛讀入的行。
另外一個Hold區就是用來臨時存放Pattern區資料的。在把Pattern區上的資料放入Hold區之前,Hold區為空。

下面是5個關於Pattern區與Hold區之間交換資料的指令:
G  將一個換行和Hold區中的資料追加到Pattern區中資料之後
g  將Hold區的資料覆蓋到Pattern區中,Pattern區中源資料全丟棄
H  將一個換行符和Pattern區中的資料追加到Hold區資料之後
h  將Pattern區中的資料覆蓋到Hold區,Hold區中的源資料全丟棄
x  交換Pattern區和Hold區中的資料

直接修改檔案內容:
sed -i.bak 's/^./#&/' a          ## -i這個知道,是直接編譯檔案的意思。但是後面再加一個.bak,意思就是儲存一個原始檔的副本,副本名是在原檔名後加上.bak字尾(.bak可以任意)

sed一次執行多個操作:
sed '/asldf/{s/a/A/;s/d/D/}' a.bak   或者使用 -e 引數,如下:
sed -e '/asldf/s/a/A/' -e '/asldf/s/d/D/' a.bak

修改後的操作另存為a.a檔案:
sed '/asldf/s/a/A/w a.a' a.bak

字元大小寫轉換:
sed '1,3y/abc/ABC/' newfile
AvdAsC
BAvBdf
CfAedB
d
e
f

本文出自 “jasonyong” 部落格,請務必保留此出處http://jasonyong.blog.違規廣告.com/47753/202531

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/90618/viewspace-622580/,如需轉載,請註明出處,否則將追究法律責任。

相關文章