1. 程式人生 > >Linux-四劍客-find-awk-grep-sed解釋----未完結版

Linux-四劍客-find-awk-grep-sed解釋----未完結版

整體 linu exec valid -i 打印 報告 .sh input

Linux的四劍客
作者:張首富
2018/07/15
[TOC]

find 查找文件或目錄

說明

find - search for files in a directory hierarchy 搜索目錄層次結構中的文件
用來在指定目錄下面查找文件或目錄,任何位於參數之前的字符串都被視為想在那個目錄下面查找

命令格式:

    `find 目錄 選項 參數`

命令選項

-type指定要查找的文件類型。

d 目錄
f 文件
l 鏈接文件
實例:

[root@zsf tmp]# touch 1.txt 2.txt
[root@zsf tmp]# mkdir a b 
[root@zsf tmp]# find /tmp/ -type f 
/tmp/1.txt
/tmp/2.txt
[root@zsf tmp]# find /tmp/ -type d
/tmp/
/tmp/.ICE-unix
/tmp/b
/tmp/a

-name按照文件名字查找

支持正則匹配,但是要加""

[root@zsf tmp]# find /tmp/ -name *.txt  #報錯
find: paths must precede expression: 2.txt
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
[root@zsf tmp]# find /tmp/ -name "*.txt"
/tmp/1.txt
/tmp/2.txt

-maxdepth 查找目錄的級數

查找幾層目錄,/是第一級目錄/tmp/就屬於第二級目錄

[root@zsf /]# find / -maxdepth 2 -name 1.txt
/tmp/1.txt
[root@zsf /]# find / -maxdepth 3 -name 1.txt
/tmp/test/1.txt
/tmp/1.txt

-size 按文件大小查找

後面需要跟單位 c表示字節
k
M
+x 代表大小大於X的
-x 代表大小小於X的
x 代表大小剛好等於X的

[root@zsf /]# dd  if=/dev/zero of\=/tmp/find_test.txt count\=1 bs\=10M 
1+0 records in
1+0 records out
10485760 bytes (10 MB) copied, 0.00732409 s, 1.4 GB/s
[root@zsf /]# dd  if=/dev/zero of\=/tmp/find_test_max.txt count\=1 bs\=11M 
1+0 records in
1+0 records out
11534336 bytes (12 MB) copied, 0.00994042 s, 1.2 GB/s
[root@zsf /]# dd  if=/dev/zero of\=/tmp/find_test_min.txt count\=1 bs\=9M 
1+0 records in
1+0 records out
9437184 bytes (9.4 MB) copied, 0.0620404 s, 152 MB/s
[root@zsf /]# find /tmp -size +10M
/tmp/find_test_max.txt
[root@zsf /]# find /tmp -size -10M
/tmp
/tmp/.ICE-unix
/tmp/find_test_min.txt
[root@zsf /]# find /tmp -size 10M
/tmp/find_test.txt

#如果查找大於6M小於9M的文件可以省略其中的-a選項
[root@backup tmp]# find /tmp/ -size +6M -a -size -9M
/tmp/find_test_2.txt
/tmp/find_test_3.txt
[root@backup tmp]# find /tmp/ -size +6M  -size -9M
/tmp/find_test_2.txt
/tmp/find_test_3.txt

#但如果想取小於6M和大於9M的文件,中間的-o選項就不能省去
[root@backup tmp]# find /tmp/ -size -6M -o -size +9M
/tmp/
/tmp/.ICE-unix
/tmp/find_test_1.txt

-mtime(Modify時間)

按照修改時間來查找,單位為天數,+ - 默認和上述一樣

[root@zsf tmp]# touch -m -d ‘2018-07-07‘ find_test.txt 
[root@zsf tmp]# touch -m -d ‘2018-07-13‘ find_test_max.txt 
[root@zsf tmp]# find /tmp -mtime +2
/tmp/find_test.txt
[root@zsf tmp]# find /tmp -mtime -2
/tmp
/tmp/.ICE-unix
/tmp/find_test_max.txt
/tmp/find_test_min.txt

-atime(Access時間)

按照訪問時間來查找
-ctime
按照更改時間來查找(Change時間)

-perm按照權限來查找

後面必須跟數字權限

[root@zsf tmp]# chmod 777 find_test.txt 
[root@zsf tmp]# find /tmp -perm 0644
/tmp/find_test_max.txt
/tmp/find_test_min.txt
[root@zsf tmp]# find /tmp -perm 0777
/tmp/find_test.txt

-user 按照文件屬主來查詢

[root@zsf tmp]# chown zsf find_test.txt 
[root@zsf tmp]# find /tmp/ -user zsf 
/tmp/find_test.txt
[root@zsf tmp]# ll
total 30720
-rw-r--r-- 1 root zsf  11534336 Jul 13  2018 find_test_max.txt
-rw-r--r-- 1 root root  9437184 Jul 10 19:45 find_test_min.txt
-rwxrwxrwx 1 zsf  root 10485760 Jul  7 00:00 find_test.txt

-nouser 查找無效屬主的文件,屬主不存在/etc/passwd裏面的,系統裏面不允許有這類文件

[root@zsf tmp]# userdel zsf
[root@zsf tmp]# find /tmp/ -nouser 
/tmp/find_test.txt

-group 按照文件屬組來查詢

[root@zsf tmp]# chown :zsf find_test_max.txt 
[root@zsf tmp]# find /tmp/ -group zsf 
/tmp/find_test_max.txt
[root@zsf tmp]# ll
total 30720
-rw-r--r-- 1 root zsf  11534336 Jul 13  2018 find_test_max.txt
-rw-r--r-- 1 root root  9437184 Jul 10 19:45 find_test_min.txt
-rwxrwxrwx 1 zsf  root 10485760 Jul  7 00:00 find_test.txt

-nogroup 查找無效屬組的文件,系統中不允許存在

-delete 查到之後刪除(比較危險)

取反

環境和2.1.3.15相同
不屬於zsf這個用戶的或者權限是777的

[root@zsf tmp]# find /tmp/ ! -user zsf -o -perm 777
/tmp/
/tmp/1.sh
/tmp/3.sh
/tmp/4.sh

-a and 取交集

[root@zsf tmp]# chown zsf 1.sh 
[root@zsf tmp]# chown zsf 2.sh 
[root@zsf tmp]# chmod 777 1.sh 
[root@zsf tmp]# ll 
total 0
-rwxrwxrwx 1 zsf  root 0 Jul 10 20:42 1.sh
-rw-r--r-- 1 zsf  root 0 Jul 10 20:39 2.sh
-rw-r--r-- 1 root root 0 Jul 10 20:39 3.sh
-rw-r--r-- 1 root root 0 Jul 10 20:42 4.sh
找屬於zsf並且權限是777的文件
[root@zsf tmp]# find /tmp/ -user zsf -a -perm 777
/tmp/1.sh

-o or 取並集

環境和2.1.3.15相同

[root@zsf tmp]# find /tmp/ -user zsf -o -perm 777
/tmp/2.sh
/tmp/1.sh

-exec 理解為傳參

find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式為‘command‘ { } \;,註意{ }\;之間的空格。


[root@oldboy_50 tmp]# touch 123
[root@oldboy_50 tmp]# ll 
total 0
-rw-r--r-- 1 root root 0 Jul 25 00:16 123
[root@oldboy_50 tmp]# find /tmp -name 123 -type f -exec mv {} 321 \;
[root@oldboy_50 tmp]# ls 
321

-exec和加 | xarge的區別

使用exec的時候是邊查找邊執行
| xargefind管道前處理完事之後,才會傳遞到後面

||xarge的區別

| 是把前面的執行結果當做文本來處理
|xargs 是把前面的執行結果當做文件名來處理

grep查找過濾

命令說明

grepegrepfgrep的作用大致相同,都是查找出匹配的行,然後打印出來。

命令格式

grep 選項 “要過濾的字符串/正則表達式” 對象

命令選項

-i 不區分字符串大小寫

[root@oldboy50 tmp]# grep "qwe" grep_file.txt 
qweqwe
[root@oldboy50 tmp]# grep "QWE" grep_file.txt 
QWEQWE
[root@oldboy50 tmp]# grep -i "QWE" grep_file.txt 
QWEQWE
qweqwe

-v 取反,輸出不匹配字符串的行

[root@oldboy50 tmp]# grep -i -v "QWE" grep_file.txt 
asdasdasd

-A num 顯示匹配到結果的行,並顯示他後面的num行

[root@oldboy50 /]# grep -A "^ntp" /etc/passwd
grep: ^ntp: invalid context length argument   #報錯是因為-A選項之後沒有跟參數
[root@oldboy50 /]# grep -A 3 "sshd" /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
zsf:x:500:500::/home/zsf:/bin/bash
rsync:x:501:501::/home/rsync:/sbin/nologin

-B num顯示匹配到結果的行,並顯示他前面的num行

[root@oldboy50 tmp]# grep -B 3 "sshd" /etc/passwd
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

-C num 顯示匹配到結果的行,並顯示他前、後面的num行

[root@oldboy50 tmp]# grep -C 3 "sshd" /etc/passwd
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
zsf:x:500:500::/home/zsf:/bin/bash
rsync:x:501:501::/home/rsync:/sbin/nologin

-E 相當於egrep,可以多條件匹配

[root@oldboy50 tmp]# grep -E "root|rsync|zsf" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
zsf:x:500:500::/home/zsf:/bin/bash
rsync:x:501:501::/home/rsync:/sbin/nologin
[root@oldboy50 tmp]# grep  "root|rsync|zsf" /etc/passwd   
#如果不加-E選項,他就會認為你要查找引號裏面整體的字符串,所以沒有匹配到的結果
[root@oldboy50 tmp]# egrep  "root|rsync|zsf" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
zsf:x:500:500::/home/zsf:/bin/bash
rsync:x:501:501::/home/rsync:/sbin/nologin

. `匹配單個字符

[root@oldboy50 tmp]# cat >grep_file.txt <<1
> zsdf
> zaf
> zef
> 1
[root@oldboy50 tmp]# grep "^z.f$" grep_file.txt 
zaf
zef

* 代表任意字符,一般配合.使用

[root@oldboy50 tmp]# grep "^z.*f$" grep_file.txt 
zsdf
zaf
zef

###\&lt;word 查找以word字符串開頭的單詞,所在的行

[root@oldboy_50 tmp]# grep "\<root" 1.txt 
root123
123 root123 123
root
這個\是轉義字符,\<root 查找只要這一樣內有一個但是是以root開頭的就行,默認一個空格裏面的就是一個單詞

word\&gt;查找以word字符串結束的單詞,所在的行

[root@oldboy_50 tmp]# grep "root\>" 1.txt 
dasdas 123root dasdas
root

###\&lt;word\&gt;查找包括word這個單詞的行

[root@oldboy_50 tmp]# grep "\<root\>" 1.txt 
root
dasdas root dasdas

x\{M\} 重復字符x,M

[root@oldboy50 tmp]# grep "a\{2}" grep_file.txt 
aasssasas
aassssaa

x\{M,\} 重復字符x,最少M

x\{M,n\} 重復字符x,最少M次,最多n

[root@oldboy50 tmp]# grep "s\{2,5}" grep_file.txt 
aasssasas
aassssaa

[] 匹配一個指定範圍的字符,

[root@oldboy50 tmp]# cat >grep_file.txt <<EOF
> 123a123
> 123b123
> 123f123
> EOF
[root@oldboy50 tmp]# grep "[a,b]" grep_file.txt 
123a123
123b123

###[^ ] 匹配一個不存在這個範圍內的字符

grep的宗旨:顯示一切的匹配行,這句話的是理解這個選項的重中之重
測試使用的原文件
[root@oldboy_50 tmp]# cat test.txt 
aabbcc
aaeebb
aaffgg
bbccee
abcc
aaaaaa
bbb

####測試1:

[root@oldboy_50 tmp]# grep  [^a] test.txt 
aabbcc          匹配了b和c
aaeebb          匹配了e和b
aaffgg          匹配了f和g
bbccee          匹配了b和c和e
abcc            匹配了b和c
bbbbbb          匹配了b
我們發現這時候aabbcc,aaeebb都出來了,並沒有過濾a這個字符啊,其實已經過濾掉了a,grep的核心是“顯示所有匹配的行”。所以幾行顯示出來並不是應為匹配了aa而是匹配了後面的bbcc,所以這一行才會顯示出來。
[root@oldboy_50 tmp]# grep  [^abc] test.txt 
aaeebb                      匹配了e
aaffgg                      匹配了fg
bbccee                      匹配了e

sed 流編輯器

命令說明

sed - stream editor for filtering and transforming text
用於過濾和轉換文本的流編輯器
命令格式
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
sed 選項 命令 文件

命令選項

-e 多點編輯,每個條件前面都必須加-e選項,不加的那個就不執行

在一個sed裏面同時執行多種操作
一條sed命令,刪除第二行,和在第5行後面增加一串字符

[root@backup tmp]# sed -e "2d" -e "5a test" 1.txt  
1
3
4
5
test

-n 取消默認輸出

sed命令默認的是把文件的每一行都輸出到屏幕上。匹配到的行輸出兩次,我們用-n取消默認輸出

[root@backup tmp]# seq 5 >1.txt
[root@backup tmp]# sed "/1/p" 1.txt 
1
1
2
3
4
5
[root@backup tmp]# sed -n  "/1/p" 1.txt
1

-i 直接對文件操作,最後放到最後使用

[root@backup tmp]# sed "s#1#a#gp" 1.txt 
a
a
2
[root@backup tmp]# cat 1.txt
1
2
[root@backup tmp]# sed -in "s#1#a#g" 1.txt 
[root@backup tmp]# cat 1.txt
a
2

替換文件文件並備份

[root@oldboy_50 tmp]#sed -i.bak "1d" 1.txt 
[root@oldboy_50 tmp]#ll -d 1.txt 1.txt.bak 
-rw-r--r-- 1 root root 0 Dec 12 22:01 1.txt
-rw-r--r-- 1 root root 0 Dec 12 05:05 1.txt.bak

-r 支持正則表達式

動作說明

[n1,[n2]] function(功能)
n1,n2不一定存在,一般代表(選擇進行動作的行數)

功能

a 新增,在匹配到的行後面插入

a的後面可以接字符串,這些字符串會在新的一行(目的的下一行)出現

[root@backup tmp]# sed "2,4a asdasd" 1.txt #在第2,3,4行後面增加一行asdasd內容
1
2
asdasd
3
asdasd
4
asdasd
5

[root@backup tmp]# sed "/3/a dasda" 1.txt  #在匹配到的行後面增加
1
2
3
dasda
4
5

c 取代

c後面可以接字符串,這些字符串會取代目標行的內容

[root@backup tmp]# sed "2,4c asdasd" 1.txt  #一行內容取代多行
1
asdasd
5
[root@backup tmp]# sed "2,4c asdasd\n31312312\ndd33" 1.txt  #多行取代多行,取代行後面要加\n來換行
1
asdasd
31312312
dd33
5
[root@backup tmp]# sed "/3/c dasda" 1.txt  #取代匹配到的行
1
2
dasda
4
5

d 刪除

d 一般後面不接內容,刪除目標

[root@backup tmp]# sed "/3/d" 1.txt   #刪除匹配到的行
1
2
4
5
[root@backup tmp]# sed "2,4d" 1.txt  #刪除指定位置的行
1
5

p 打印

選擇將那個數據輸出,一般配合-n(安靜)使用

[root@backup tmp]# sed -n "s#2#a#gp" 1.txt
a

s 替換

可以直接進行取代的工作。通常用法s#原內容#替換成內容#g #就是一個分隔符,可以用任意字符替換

[root@backup tmp]# sed -n "s#2#a#gp" 1.txt   #分隔字符串是什麽沒影響
a
[root@backup tmp]# sed -n "s/2/a/gp" 1.txt
a

i 插入,在匹配到的行前面插入

[root@backup tmp]# sed "/3/i dadas" 1.txt
1
2
dadas
3
4
5

N 讀取/附加下一行輸入到模式空間(一次性讀取兩行)

sed = 參數有顯示行號的功能,但是行號和內容不在一行,我們想讓他在一行,sed "N"幫我們解決了這個問題。

[root@oldboy_50 tmp]# sed  ‘N;s#\n#:#‘ 3.txt 
1 10:2 11
3 12:4 13
5 14:6 15
7 16:8 17

這個裏面必須要把\n給替換掉,如果不替換掉,你會發現他的第二行沒有給第一行一塊讀取啊,可能就會認為linux欺騙了你,實際Linux是不會欺騙你的。沒在一行是因為 輸出的時候有一個\n又把第二行給換下去了。
而且替換的時候還不能加g全局替換,如果加g的話他會把所有的內容都變成1行,而不是只替換第一個了

= 顯示行號,一般配合 N使用

[root@oldboy_50 tmp]# sed = nginx.txt |  sed ‘N;s/\n/:/‘ 
1:a
2:b
3:c
4:d
5:e
6:f
7:g

awk 文本分析工具

命令說明

awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據的分析並生成報告時,顯得尤為強大。簡單的來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分在進行各種分析處理。

命令格式

awk ‘{pattern + action}‘ {filenames}
pattern表示awk在數據中查找的內容,
action 表示在查找到匹配內容的時候幹什麽
一般,wak是以文件的一行為處理單位的。awk每接收文件的一行,然後執行相應的命令,來處理

awk的三種調用方式

命令行方式

awk [-F field-separator] ‘commands‘ input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的文件。
在awk中,文件的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格。

shell腳本方式

將所有的awk命令插入一個文件,並使awk程序可執行,然後awk命令解釋器作為腳本的首行,一遍通過鍵入腳本名稱來調用。
相當於shell腳本首行的:#!/bin/sh
可以換成:#!/bin/awk
將所有的awk命令插入一個單獨的文件,然後調用
awk -f awk-script-file input-file(s)
其中,-f選項加載awk-script-file中的awk腳本,input-file(s)跟上面的是一樣的。

命令選項、內置變量

-F 指定分隔符,默認是以空格分隔

[root@oldboy_50 tmp]# cat >>awk_test.txt<<EOF
> 123:321 456 789:987
> EOF
[root@oldboy_50 tmp]# awk ‘{print ‘ awk_test.txt 
123:321
[root@oldboy_50 tmp]# awk -F ":" ‘{print [root@oldboy_50 tmp]# cat >>awk_test.txt<<EOF
> 123:321 456 789:987
> EOF
[root@oldboy_50 tmp]# awk ‘{print }‘ awk_test.txt 
123}

$0,$1.........匹配到的第幾塊域

$0 代表匹配到的所有域,整行
$1 代表匹配到的第一個域,
$2 代表匹配到的第二個域

[root@oldboy_50 tmp]# cat awk_test.txt 
123:321 456 789:987
[root@oldboy_50 tmp]# awk -F ":" ‘{print ‘ awk_test.txt 
123:321 456 789:987
[root@oldboy_50 tmp]# awk -F ":" ‘{print [root@oldboy_50 tmp]# cat awk_test.txt 
123:321 456 789:987
[root@oldboy_50 tmp]# awk -F ":" ‘{print }‘ awk_test.txt 
123
[root@oldboy_50 tmp]# awk -F ":" ‘{print }‘ awk_test.txt 
321 456 789}

BEGIN 頭部,後面跟‘{print "頭部信息"}‘,給輸出加上頭部

[root@oldboy_50 tmp]# awk -F ":" ‘BEGIN {print "user_name\tHome_directory"  {print [root@oldboy_50 tmp]# awk -F ":" ‘BEGIN {print "user_name\tHome_directory""\t"}‘  /etc/passwd 
user_name    Home_directory
root    /root
bin    /bin
daemon    /sbin
adm    /var/adm
lp    /var/spool/lpd}

END 尾部,在輸出的最後一行加入內容,後面跟‘{print "尾部信息"}‘

[root@oldboy_50 tmp]# awk -F ":" ‘BEGIN {print "開始" {print [root@oldboy_50 tmp]# awk -F ":" ‘BEGIN {print "開始"} END {print "結束"}‘ awk_test.txt 
開始
123
結束}

搜索匹配字符串的行“和sed類似”

#查找出來包含root的行,並把它登錄的shell顯示出來
[root@oldboy_50 tmp]# awk -F : ‘/root/ {print $7}‘ /etc/passwd
/bin/bash
/sbin/nologin
#匹配以root開頭的用戶,並顯示他的登錄shell
[root@oldboy_50 tmp]# awk -F : ‘/^root/ {print $7}‘ /etc/passwd
/bin/bash
#查找出不能登錄的系統的用戶,只顯示文件名
[root@oldboy_50 tmp]# awk -F : ‘/nologin$/ {print $1}‘ /etc/passwd
bin
daemon
adm

awk的內置變量

awk有許多內置變量用來設置環境信息的,這些變量可以被改變
ARGC 命令行參數個數
ARGV
ENVIRON 支持隊列中系統環境變量的使用
FILENAME awk瀏覽的文件名(操作的文件名)

[root@oldboy_50 ~]# awk ‘BEGIN{FS=":";OFS="$" {print [root@oldboy_50 ~]# awk ‘BEGIN{FS=":";OFS="$","\t"FILENAME}‘ /etc/passwd| head -3
root    /etc/passwd
bin    /etc/passwd
daemon    /etc/passwd}

FNR 瀏覽文件的記錄數
FS 設置輸入域分隔符,等價於命令-F 選項(分隔符)

[root@oldboy_50 ~]# awk ‘BEGIN{FS=":"} {print $1}‘ /etc/passwd| head -3
root
bin
daemon

NF 瀏覽記錄的域的個數(列的個數)
NR 已讀的記錄數,記錄行號(行)
OFS 輸出域分隔符 (輸入分隔符)

[root@oldboy_50 ~]# awk ‘BEGIN{FS=":";OFS="$"} {print $1,$2}‘ /etc/passwd| head -3
root$x
bin$x
daemon$x

ORS 輸出記錄分隔符
RS 控制記錄分隔符
printprintf
雖然這兩個都是輸出的意思,print是正常輸出,printf可以帶格式的輸出
其中print函數的參數可以是變量、數值或字符串。字符串必須用雙引號,參數用逗號分隔,如果沒有逗號,參數就串聯在一起而無法區分。
printf函數,其用法和C語言的printf基本像是。格式化復雜化輸出

[root@oldboy_50 tmp]# awk ‘{print "filename:" FILENAME ",Linenumber" NR "file_link" $0}‘ /etc/passwd | head -2
filename:/etc/passwd,Linenumber1file_linkroot:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,Linenumber2file_linkbin:x:1:1:bin:/bin:/sbin/nologin

printf標準的格式化輸出。

[root@oldboy_50 tmp]# awk ‘{printf("filename:%s;Linenumber:%d;file_line:%s\n",FILENAME,NR,$0)}‘ /etc/passwd | head -2
filename:/etc/passwd;Linenumber:1;file_line:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd;Linenumber:2;file_line:bin:x:1:1:bin:/bin:/sbin/nologin

gsub函數,替換函數相當於sed "s//g"

[root@oldboy_50 tmp]# cat 1.txt 
i am  oldboy,dasasd 123
[root@oldboy_50 tmp]# awk ‘gsub(/,/," ",$3)‘ 1.txt | awk ‘{print $3,$5}‘
oldboy 123

sub函數,相當於sed "s//",只替換匹配到的第一次

把第一個域裏面的內容替換成第二個
有一個文本文件data.test的內容如下:

0001|20081223efskjfdj|EREADFASDLKJCV
0002|20081208djfksdaa|JDKFJALSDJFsddf
0003|20081208efskjfdj|EREADFASDLKJCV
0004|20081211djfksdaa1234|JDKFJALSDJFsddf

以‘|‘為分隔, 現要將第二個域字母前的數字去掉,其他地方都不變, 輸出為:

0001|efskjfdj|EREADFASDLKJCV
0002|djfksdaa|JDKFJALSDJFsddf
0003|efskjfdj|EREADFASDLKJCV
0004|djfksdaa1234|JDKFJALSDJFsddf

解決辦法:

[root@oldboy_50 tmp]# awk -F "|" ‘BEGIN{OFS="|";}sub(/[0-9]+/,"",$2)‘ 1.txt 
0001|efskjfdj|EREADFASDLKJCV
0002|djfksdaa|JDKFJALSDJFsddf
0003|efskjfdj|EREADFASDLKJCV
0004|djfksdaa1234|JDKFJALSDJFsddf

awk編程,變量和賦值

[root@oldboy_50 tmp]# awk ‘BEGIN {count=0;print "count=0"} {count=count+1} END {print count}‘ /etc/passwd
count=0
24

舉例

查找登錄SHELL是/bin/bash的用戶信息
方法一:

[root@oldboy_50 ~]# awk -F‘:‘ ‘$NF=="/bin/bash"{print $0}‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
zsf:x:500:500::/home/zsf:/bin/bash

方法二:

[root@oldboy_50 ~]# awk -F‘:‘ ‘/\/bin\/bash$/{print $0}‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
zsf:x:500:500::/home/zsf:/bin/bash

方法三:

[root@oldboy_50 ~]# awk ‘BEGIN {shell="/bin/bash";FS=":"} $NF==shell {print $0}‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
zsf:x:500:500::/home/zsf:/bin/bash
### `-n` 顯示匹配到行的行號,和`cat -n`選項意思一樣

[root@oldboy50 tmp]# grep -n "zsf" /etc/passwd
25:zsf:x:500:500::/home/zsf:/bin/bash


### 正則表達
#### `^str`   以什麽字符串開頭

[root@oldboy50 tmp]# cat >grep_file.txt<<EOF

zsf12
12zsf12
12zsf
EOF
[root@oldboy50 tmp]# grep "zsf" grep_file.txt
zsf12
12zsf12
12zsf
[root@oldboy50 tmp]# grep "^zsf" grep_file.txt
zsf12

str$ 以什麽字符串結尾

[root@oldboy50 tmp]# grep "zsf$" grep_file.txt 
12zsf

`

Linux-四劍客-find-awk-grep-sed解釋----未完結版