Linux-四劍客-find-awk-grep-sed解釋----未完結版
作者:張首富
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的時候是邊查找邊執行| xarge
是find
管道前處理完事之後,才會傳遞到後面
|
和 |xarge
的區別
|
是把前面的執行結果當做文本來處理|xargs
是把前面的執行結果當做文件名來處理
grep查找過濾
命令說明
grep
和egrep
和fgrep
的作用大致相同,都是查找出匹配的行,然後打印出來。
命令格式
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
###\<word
查找以word
字符串開頭的單詞,所在的行
[root@oldboy_50 tmp]# grep "\<root" 1.txt
root123
123 root123 123
root
這個\是轉義字符,\<root 查找只要這一樣內有一個但是是以root開頭的就行,默認一個空格裏面的就是一個單詞
word\>
查找以word
字符串結束的單詞,所在的行
[root@oldboy_50 tmp]# grep "root\>" 1.txt
dasdas 123root dasdas
root
###\<word\>
查找包括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
控制記錄分隔符print
和printf
雖然這兩個都是輸出的意思,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解釋----未完結版