awk 命令之常見問題

2021-09-01 19:48:14 字數 3776 閱讀 3452

保留最新的9個檔案

ls -t /tmp/ | awk '}' | while read line; do rm -f /tmp/$line; done

#下面的指令在檔案太多的時候不能成功執行

ls -t /tmp/ | awk '}' | xargs rm -f

將/home/test 目錄下大於10k的檔案轉移到/tmp目錄下

#!/bin/sh

cd /home/test

for i in `ls -l |awk '}'`

do mv $i /tmp

done

列印所有輸出行

nr==8 列印輸入檔案第八行

}awk -f: '' 列印檔案所有行的第乙個字段

awk 'end' 列印輸入行總數

awk -f: '' 列印每行字段數

awk -f: 'end' 列印最後一行的最後乙個欄位的值

awk -f: 'nf>=4'列印字段多餘4行的行

awk -f: 'begin(num=0) end' 列印檔案所有欄位的總數

awk -f: '$3>=30 && $4 <=40' 列印uid在30~40範圍的使用者名稱

printf("\n")}倒序排列檔案的所有字段

print直接換行printf需要\n此換行,%s輸出字串

awk -f: 'nr>=5&&nr<=56' 列印5到56行

awk 'begin'在檔案頂部加上標題「document」

awk 'nf%2==0' 隔行刪除偶數行

awk 'nf%2==1' 隔行刪除奇數行

beginif(j==1)i=i+1}printf("\n")} 非字母的分段 i定義的字段,j用來判斷是否為單詞 每行抽出第乙個單詞

beginif(j==1&&j==3)i=i+1}printf("\n")} 列印每行的第乙個單詞和第三個單詞

begin}end 列印字段數大於5個的行總數

1. awk 『1』 中的「1」是幹什麼的?

乙個完整的awk語句為:awk 『[patten]……』, 其中pattern預設為1,action預設為。

那麼awk 『1』完整的寫法就是awk 『1』; 同理,awk 『』完整的寫法也是awk 『1』。

2. nr和fnr的區別是啥?

nr: 當前行記錄數。

fnr: 當前檔案的行記錄數。

當awk處理的檔案數超過1時,nr和fnr才會有區別。例如:

cat fileab

cdef

awk '' file

nr = 1 fnr = 1 a

nr = 2 fnr = 2 b

nr = 3 fnr = 3 c

nr = 4 fnr = 4 d

nr = 5 fnr = 5 e

nr = 6 fnr = 6 f

awk '' file file

nr = 1 fnr = 1 a

nr = 2 fnr = 2 b

nr = 3 fnr = 3 c

nr = 4 fnr = 4 d

nr = 5 fnr = 5 e

nr = 6 fnr = 6 f

nr = 7 fnr = 1 a

nr = 8 fnr = 2 b

nr = 9 fnr = 3 c

nr = 10 fnr = 4 d

nr = 11 fnr = 5 e

nr = 12 fnr = 6 f

3. awk怎麼引入變數?

有兩種方法:

<1>: awk -v var=$var ''

<2>: awk ''$var''

例如:

var=***

awk -v var=$var 'begin'

***awk 'begin'

***

推薦使用第一種方法,這樣可以避免一些不必要的煩惱。

4. 為什麼ofs不起作用?

先看乙個例子:

echo 'aaa bbb ccc ddd

aaa bbb ccc ddd

aaa bbb ccc ddd

aaa bbb ccc ddd' |awk -v ofs="|" ''

aaa bbb ccc ddd

aaa bbb ccc ddd

aaa bbb ccc ddd

aaa bbb ccc ddd

上面的例子中ofs為什麼沒有生效呢,原因是ofs指的是輸出字段分隔符,所以必須對欄位進行操作時ofs才會起作用,正確的方法應該是:

echo 'aaa bbb ccc ddd

aaa bbb ccc ddd

aaa bbb ccc ddd

aaa bbb ccc ddd' |awk -v ofs="|" ''

aaa|bbb|ccc|ddd

aaa|bbb|ccc|ddd

aaa|bbb|ccc|ddd

aaa|bbb|ccc|ddd

正如tim大師所講的,$1=$1這個action,是我們對awk撒的謊,目的就是為了使得ofs生效,除此之外,nf+=0也是常用的方法。

5. print,printf 和sprintf?

print:預設有個換行\n,為一般的列印

printf:可以定義列印格式,能列印各種格式,但預設沒有換行。

sprintf:可以完成和printf相同的功能,不同的是sprintf只能輸出值,並不能完成列印的功能。

awk 'begin'

var = 123

awk 'begin'

var = 123.000000

awk 'begin'

awk 『begin』

var2 = 123.000000

6. 如何列印單雙引號?

awk 'begin '

7. awk 語句中多個{}是怎麼執行的?

cat file12

345awk '$1==3' file # 這個語句中包含三個action

@@ 11 # 判斷$1==3?否;執行 action ;執行 action

@@ 22 # 判斷$1==3?否;執行 action ;執行 action

|| 3 @@ 33 # 判斷$1==3?是,執行; 執行 action ;執行 action

@@ 44 # 判斷$1==3?否;執行 action ;執行 action

@@ 55 # 判斷$1==3?否;執行 action ;執行 action

這樣可以清楚的看出,awk是一行一行讀取文字,然後按照**的前後順序執行。但如果action中包含next或exit時,有所不同:

awk '$1==3' file

@@ 11

@@ 22

|| 3@@ 44

@@ 55

awk '$1==3' file

@@ 11

@@ 22

|| 3

JAVA之常見問題

與equals 的區別 比較的是兩個物件的位址 equals 比較的是2個物件的內容 是比較兩個 基本型別 的值是否相等,equals 是比較兩個物件是否相等。switch語句中的變數型別只能是 byte short int char string。實現多型的三個條件 繼承 重寫 向上轉型。每個方法...

Mac之常見問題

1.在命令列下無法使用ll命令 需要設定命令的別名。檔案位置 bash profile source profile export path usr local opt php 7.2 bin path export path usr local opt php 7.2 sbin path expo...

git命令常見問題總結

1 git如何放棄所有本地修改 git checkout 本地所有修改的。沒有的提交的,都返回到原來的狀態 git stash 把所有沒有提交的修改暫存到stash裡面。可用git stash pop回覆。git reset hard hash 返回到某個節點,不保留修改。git reset sof...