Linux 擷取符合複雜條件的列命令 awk

2021-09-29 10:23:22 字數 3672 閱讀 2020

命令語法awk條件1條件2

...檔名

命令條件

一般使用關係表示式作為條件

x > 10 判斷變數x是否大於10

x >= 10 判斷變數是否大於等於10

x <= 10 判斷變數是否小於等於10

命令動作

格式化輸出 (,表示輸出第n列;$n表示第n列)

流程控制語句

命令作用:awk是乙個複雜的命令,可以在裡面進行程式設計等複雜的操作。

示例:
[root@192 cut]# cat score.txt

id name gender score

1 zhangsan m 90

2 lisi m 88

3 wangwu m 98

4 zhaoliu n 97

5 nangongyi m 100

例項:使用awk命令格式輸出第2,4列內容
[root@192 cut]# awk '' score.txt

name score

zhangsan 90

lisi 88

wangwu 98

zhaoliu 97

nangongyi 100

[root@192 cut]#

注意:awk提取列,它是先提取第一行的第2,4列,然後,提取第二行的第2,4列,接著第三行的第2,4列,一直到文字結束。
例項:我要獲取當前系統的根目錄的磁碟空間大小
[root@192 cut]# df -h

檔案系統 容量 已用 可用 已用%% 掛載點

/dev/sda3 17g 2.6g 14g 17% /

tmpfs 499m 0 499m 0% /dev/shm

/dev/sda1 985m 40m 896m 5% /boot

a、先提取df -h 命令輸出的第一行

[root@192 cut]# df -h | grep sda3

/dev/sda3 17g 2.6g 14g 17% /

[root@192 cut]#

b、再提取a結果的第五列

[root@192 cut]# df -h | grep sda3 | awk ''

17%[root@192 cut]#

c、以」%」為分隔符,獲取第乙個元素

[root@192 cut]# df -h | grep sda3 | awk '' | cut -d "%" -f 1

17[root@192 cut]#

begin
作用:是個條件,只有滿足了begin這個條件,才開始執行。表示,在所有輸出之前,輸出begin後的內容。再處理其他動作。
例項:awk 'begin  ' score.txt
[root@192 cut]# awk 'begin  ' score.txt

this is new begin!

name score

zhangsan 90

lisi 88

wangwu 98

zhaoliu 97

nangongyi 100

[root@192 cut]#

那麼begin的作用到底是在**?往下看:

fs內建變數:定義分隔符

作用:指定分隔符

例項:從passwd檔案中獲取所有的非系統使用者- cat /etc/passwd | grep "/bin/bash" | awk ' '
[root@192 cut]# cat /etc/passwd | grep "/bin/bash" | awk ' '

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

user1 500

user2 501

user3 502

[root@192 cut]#

仔細觀察:我們發現,第一行也被輸出出來了。這是為什麼呢?原來,awk是先讀入第一行資料,然後,再執行命令操作。
例項:從passwd檔案中獲取所有的非系統使用者,並去掉第一行- cat /etc/passwd | grep "/bin/bash" | awk 'begin  '
[root@192 cut]# cat /etc/passwd | grep "/bin/bash" | awk 'begin  '

root 0

user1 500

user2 501

user3 502

[root@192 cut]#

注意:

1、awk預設能夠識別的分隔符是「空格」、「製表符」,但是,現實中,我們見到的分隔符,可能不止這幾個,需要我們根據實際情況,進行指定,這時,就用到fs了,它是awk命令中用來指定分隔符的變數。

2、begin表示在讀入第一行資料之前,就先把分隔符寫入操作,然後,再來處理,這樣,第一行資料,就被處理了。手動分割,一般與fs並存。

end
作用:在命令執行完後,輸出end標識的字元內容。
例項:從score.txt檔案,獲取第2,4列,並在最後輸出「the end」- awk 'end  ' score.txt
[root@192 cut]# awk 'end  ' score.txt

name score

zhangsan 90

lisi 88

wangwu 98

zhaoliu 97

nangongyi 100

the end

[root@192 cut]#

關係運算子
例項:從score.txt檔案中獲取分數100分的使用者
a、過濾掉不用的行 cat score.txt | grep -v name

[root@192 cut]# cat score.txt | grep -v name

1 zhangsan m 90

2 lisi m 88

3 wangwu m 98

4 zhaoliu n 97

5 nangongyi m 100

[root@192 cut]#

b、對第4列運算,結果輸出第2列 cat score.txt | grep -v name | awk '$4>=100 '

[root@192 cut]# cat score.txt | grep -v name | awk '$4>=100 '

nangongyi

[root@192 cut]#

Oracle中統計符合某列條件的列總數

最近在專案報表中需要乙個查詢語句,用來統計符合某一列條件的其它幾列的個數 比如有下面乙個表結構 經過自己試驗,查詢幫助,總算實現了上面的查詢。首先講幾個函式的用法 null 指的是空值,或者非法值。nvl expr1,expr2 引數說明 如果expr1為null,返回expr2 不為null,返回...

linux刪除符合條件的檔案

找到根目錄下所有的以test開頭的檔案並把查詢結果當做引數傳給rm rf命令進行刪除 1 find name test xargs rm rf 2 find name test exec rm rf 3 rm rf find name test 如果想指定遞迴深度,可以這樣 1 find maxde...

linux查詢符合條件的檔案並刪除

找到根目錄下所有的以test開頭的檔案並把查詢結果當做引數傳給rm rf命令進行刪除 1 find name test xargs rm rf 2 find name test exec rm rf 3 rm rf find name test 如果想指定遞迴深度,可以這樣 1 find maxde...