日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747


Linux技巧:awk 命令簡單入門介紹

 

在 linux 命令中,awk 命令常用于處理文本內容。下面基于實例介紹 awk 命令的常見用法。

GNU gawk

awk 既是一個命令,也是一種程序語言,它可以有不同的實現版本。

在 Linux 系統中,awk 的實現版本是 GNU gawk。

在 shell 中執行 awk 命令,實際執行的是 gawk 命令。如下所示:

$ ls -l /usr/bin/awk
lrwxrwxrwx 1 root root 21  2月  1  2019 /usr/bin/awk -> /etc/alternatives/awk
$ ls -l /etc/alternatives/awk
lrwxrwxrwx 1 root root 13  3月  8  2019 /etc/alternatives/awk -> /usr/bin/gawk
$ ls -l /usr/bin/gawk
-rwxr-xr-x 1 root root 441512  7月  3  2013 /usr/bin/gawk

可以看到,/usr/bin/awk 文件最終鏈接到 /usr/bin/gawk 文件,/usr/bin/gawk 文件沒有再鏈接到其他文件。

在下面的描述中,如無特別說明,所說的 awk 是指 GNU gawk。

awk 命令格式

查看 man awk 的說明,也是鏈接到 man gawk 的內容,這個說明比較難懂,不夠清晰,可以再參考 GNU gawk 在線幫助手冊 https://www.gnu.org/software/gawk/manual/gawk.html 的說明。

下面引用的內容就出自這個在線幫助手冊,其中對 awk 的基本介紹如下:

The basic function of awk is to search files for lines (or other units of text) that contain certain patterns.

When a line matches one of the patterns, awk performs specified actions on that line.

awk continues to process input lines in this way until it reaches the end of the input files.

awk 命令的基本用法說明如下:

There are several ways to run an awk program.

If the program is short, it is easiest to include it in the command that runs awk, like this:awk 'program' input-file1 input-file2 …

where program consists of a series of patterns and actions, an awk program looks like this:

pattern { action }

 

When the program is long, it is usually more convenient to put it in a file and run it with a command like this:

awk -f program-file input-file1 input-file2 …

 

There are single quotes around program so the shell won’t interpret any awk characters as special shell characters.

The quotes also cause the shell to treat all of program as a single argument for awk, and allow program to be more than one line long.

 

You can also run awk without any input files. If you type the following command line:

awk 'program'

awk Applies the program to the standard input, which usually means whatever you type on the keyboard.

即,awk 命令在所給文件中查找包含特定模式的行,并對找到的行進行特定處理。這些特定處理由 program 參數指定。

上面提到,所給的 program 參數要用單引號括起來,避免 shell 對一些特殊字符進行擴展。

如果沒有提供文件名,awk 命令默認會讀取標準輸入。

如果沒有提供特定模式,默認處理所有行。

注意:跟在 awk 命令的 program 參數后面的參數會被認為是文件名,即使用引號把參數值括起來也還是當成文件名,不會當成字符串。

這個命令不能處理命令行參數提供的字符串值,具體舉例說明如下:

$ cat testawk
This is a test string.
This is another TEST string.
$ awk '{print $3}' testawk
a
another
$ awk '{print $3}' "testawk"
a
another
$ awk '{print $3}' "This is a test string."
awk: fatal: cannot open file `This is a test string.' for reading (No such file or directory)

可以看到,awk '{print $3}' testawk 命令打印出 testawk 文件的第三列內容。

awk '{print $3}' "testawk" 命令也是打印出 testawk 文件的第三列內容。即使用雙引號把 testawk 括起來,也不代表是打印 "testawk" 字符串的第三列。

而 awk '{print $3}' "This is a test string." 命令會執行報錯,提示找不到名為 This is a test string. 的文件,它不會處理 "This is a test string." 這個字符串自身的內容,而是把該字符串當成文件名,要處理對應文件的內容。

如果確實需要用 awk 命令來處理字符串,可以用管道操作符 | 來連接標準輸入。

例如用 echo 命令打印字符串的值,然后通過管道操作符把這個值傳遞到 awk 命令的標準輸入。

具體舉例如下:

$ echo "This is a test string." | awk '{print $4}'
test
$ value="This is a new test string."
$ echo "$value" | awk '{print $4}'
new

可以看到,echo "This is a test string." | awk '{print $4}' 命令通過 echo 先輸出字符串的值,再通過管道操作符 | 把這個輸出連接到 awk 命令的標準輸入,就能對這個字符串進行處理,不會執行報錯。

echo "$value" | awk '{print $4}' 命令打印出 value 變量值的第四列內容,可以用這個方式來對變量值進行處理。

注意:這里使用管道操作符 | 來連接標準輸入,讓 awk 命令能夠處理傳入到標準輸入的字符串,但是使用重定向標準輸入操作符 < 并不能讓 awk 命令處理字符串。

重定向是基于文件的操作,所給的字符串會被當成文件名,舉例如下:

$ awk '{print $4}' < "This is a test string."
-bash: This is a test string.: No such file or directory

可以看到,在重定向標準輸入操作符 < 右邊的 "This is a test string." 字符串被當成文件名,bash 提示找不到文件。

這里不是 awk 命令報錯,而是 bash 在處理重定向的時候報錯。

awk program

使用 awk 命令的關鍵在于,program 參數要怎么寫。

查看 GNU gawk 在線幫助手冊的說明,列舉部分內容如下:

  • Programs in awk consist of pattern–action pairs.
  • An action without a pattern always runs.
  • An awk program generally looks like this: [pattern] { action }
  • Patterns in awk control the execution of rules -- a rule is executed when its pattern matches the current input record.
  • The purpose of the action is to tell awk what to do once a match for the pattern is found.
  • An action consists of one or more awk statements, enclosed in braces (‘{…}’).

即,awk 命令的 program 參數由 pattern 和 action 組成。Pattern 用于指定匹配模式,并對匹配的行執行后面的 action 操作,不匹配的行不做處理。Action 用于指定要對匹配到的行進行什么樣的操作,這些操作語句要包含在大括號 {} 里面。如果沒有提供 pattern 參數,默認處理所有行。

部分 pattern 參數的寫法說明如下:

  • /regular expression/
    A regular expression. It matches when the text of the input record fits the regular expression.
  • expression
    A single expression. It matches when its value is nonzero (if a number) or non-null (if a string).

具體舉例說明如下:

$ awk '/a.*/ {print $0}' testawk
This is a test string.
This is another TEST string.
$ awk '/test/ {print $0}' testawk
This is a test string.
$ awk 'test {print $0}' testawk
$ awk '"NONE" {print $0}' testawk
This is a test string.
This is another TEST string.
$ awk '$3 == "another" {print $0}' testawk
This is another TEST string.

可以看到,awk '/a.*/ {print $0}' testawk 命令使用 a.* 正則表達式來匹配包含字符 ‘a’ 的行,然后打印出整行內容。

awk '/test/ {print $0}' testawk 命令則是打印包含 "test" 字符串的行。

awk 'test {print $0}' testawk 命令什么都沒有打印,這種寫法并不表示打印包含 "test" 字符串的行。

awk '"NONE" {print $0}' testawk 命令打印出 testawk 文件的所有行,雖然這個文件并沒有包含 "NONE" 字符串。基于上面說明,所給的 pattern 參數是一個用雙引號括起來的非空字符串,表示總是匹配,不管這個字符串的內容是什么。

awk '$3 == "another" {print $0}' testawk 命令匹配第三列內容為 "another" 字符串的行,并打印出整行內容。

即,如果要指定匹配某個字符串,pattern 參數寫為 “/regular expression/” 的形式會比較簡單,要寫為 “expression” 形式,需要了解 awk 的表達式寫法。

獲取所給行的內容

awk 在讀取每行內容時,會基于分割字符把行內容拆分成多個單詞,可以用 $number 來獲取第 number 列的單詞,number 值從 1 開始。例如,$1 對應第一列的單詞,$2 對應第二列的單詞,$3 對應第三列的單詞,依此類推。可以用 $NF 來獲取拆分后的最后一列內容。

特別的,$0 獲取到整行的內容,包括行首、或者行末的任意空白字符。

以 "This is a test string." 這一行進行舉例,有如下的對應關系:

Linux技巧:awk 命令簡單入門介紹

awk行字段獲取方法

使用 -F 選項指定分割字符

前面提到,awk 默認使用空格來拆分行內容為多個單詞。如果想要基于其他字符來進行拆分,可以使用 -F 選項來指定分割字符。

GNU gawk 在線幫助手冊對 -F 選項說明如下:

-F fs

--field-separator fs

Set the FS variable to fs.

例如對 "clang/utils/analyzer/" 這樣的目錄路徑來說,如果想要基于 / 進行拆分,以便獲取各個目錄名,就可以使用 -F 選項來指定分割字符為 /

具體舉例如下:

$ echo "clang/utils/analyzer/" | awk -F '/' '{print $1, $2}'
clang utils
$ echo "clang/utils/analyzer/" | awk -F '/' '{print "Last word is: " $NF}'
Last word is: 

可以看到,使用 -F '/' 指定分割字符后,所給內容會以 / 來進行拆分,拆分后的單詞不包含 ‘/’ 這個字符。

由于所給內容的最后一個字符是 ‘/’,最后一列拆分后的內容為空,所以 $NF 的內容為空。

當需要基于特定字符分割行內容時,使用 awk 命令特別實用,-F 選項可以指定分割字符,然后用 $number 就能獲取到第 number 列的內容,方便處理。

print 語句

前面的例子都用了 print 語句來打印內容。

GNU gawk 在線幫助手冊對 print 語句的說明如下:

Use the print statement to produce output with simple, standardized formatting.

You specify only the strings or numbers to print, in a list separated by commas.

They are output, separated by single spaces, followed by a newline.

The statement looks like this:

print item1, item2, …

 

The entire list of items may be optionally enclosed in parentheses.

The simple statement ‘print’ with no items is equivalent to ‘print $0’: it prints the entire current record.

即,print 語句打印所給字符串、或者數字的內容,不同內容之間要用逗號 ‘,' 隔開,但是打印出來的效果是用空格隔開。

經過測試,如果用其他字符隔開會不生效,打印的內容會連在一起。具體舉例說明如下:

$ awk '/test/ {print $3, $5}' testawk
a string.
$ awk '/test/ {print $3 $5}' testawk
astring.
$ awk '/test/ {print $3_$5}' testawk
astring.

可以看到,在 print 后面寫為 $3, $5 時,打印的兩個字符串用空格隔開,而寫為 $3 $5、或者 $3_$5,打印的兩個字符串直接連在一起,沒有打印所給的空格、或者下劃線 ‘_’。即,只能用逗號來隔開。

如果在 print 后面沒有提供參數,默認相當于 print $0,會打印整行內容。如果沒有提供任何 action 參數,連大括號 {} 都不提供,默認相當于 { print $0 }。如果只提供大括號 {},大括號里面沒有內容,則是空操作,什么都不做。

具體舉例如下:

$ awk '/test/ {print}' testawk
This is a test string.
$ awk '/test/' testawk
This is a test string.
$ awk '/test/ {}' testawk

可以看到,awk '/test/ {print}' testawk 命令在 print 后面提供參數,打印出整行內容。

awk '/test/' testawk 命令沒有提供 action 參數,也是打印出整行內容。

awk '/test/ {}' testawk 命令提供了 action 參數,只是沒有指定要做的操作,什么都沒有打印。

分享到:
標簽:命令 awk
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定