shell三劍客:(二)awk的基礎用法

2021-12-24 慕柏生物

目錄一、awk的基礎知識1.1 awk常用參數1.2 awk常用內置變量1.3 awk命令的特殊表達式1.4 awk使用格式:二、awk的基礎命令2.1 輸出文件中每行的第一個欄位2.2 輸出gggj文件中包含「good」的行2.3 輸出gggj文件包含「good」行的第一列2.4 以逗號為分隔符,輸出gggj的第一和第三列2.5 輸出第2行到第3行的內容,並且加上行號2.6 輸出第1列的內容,並且顯示出欄位數(總列數)2.7 通過FS修改分隔符,進行輸出2.8 通過OFS修改分隔符,輸出第一列和最後一列三、sed和awk聯用3.1 查看sed命令的結果3.2 默認分隔符,列印第四列3.3 以逗號為分隔符,列印第二列3.4 列印全部3.5 使用sort排序四、awk的較高級用法4.1 列印角色名和代表歌曲,中間用逗號隔開4.2 查找含有「Murong」的行,列印「第三列+第四列」4.3 使用「~」匹配4.4 使用「!~」反轉五、awk處理兩個文件5.1 NR和FNR5.1.1 兩個文件的分隔符相同5.1.2 兩個文件的分隔符不同5.2 合併5.3 查找缺失行號

awk的由來
awk是貝爾實驗室1977年搞出來的為Unix/Linux提供樣式掃描與處理工具,非常擅長處理結構化數據和生成表單。與sed 和grep 相似,但功能卻超過兩者,之所以叫awk是因為其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。

awk指令與sed指令結構相同,都由模式和過程兩部分組成,但過程本身不同。awk為每個輸入行執行一套指令,也可以在命令行上指定指令或創建腳本文件,看上去更像一種程序設計語言。若想練習awk命令,可以在linux或mac下練習,windows可以下載Git Bash或者ubuntu子系統練習。

本文主要介紹了awk常用參數內置變量正確使用格式。還有awk的按需求列印,與sed連用和處理兩個文件等其他功能。

目錄

一、awk的基礎知識
二、awk的基礎命令
三、awk與sed的結合
四、欄位的引用和分離
五、awk的較高級用法

一、awk的基礎知識1.1 awk常用參數 參數作用-F指定行中分隔數據欄位分隔符-f指定讀取程序的文件名-v定義awk程序中的一個變量及其默認值1.2 awk常用內置變量 變量作用FS分隔符,默認是空格OFS輸出分隔符NR當前行數,從1開始NF當前記錄欄位個數FNR當前讀取的記錄數,其變量值小於等於NR1.3 awk命令的特殊表達式 命令作用BEGIN在處理數據之前執行操作END在處理完數據後執行一項操作1.4 awk使用格式:

awk [參數] 『命令』 文件

二、awk的基礎命令

#查看文件gggj
$ cat gggj
Name, Color, Character/ Mom
Xiaosage, white, good/ hen
Heidashuai, black, bad/ hen
$

2.1 輸出文件中每行的第一個欄位

$ awk '{print $1}' gggj
Name,
Xiaosage,
Heidashuai,
$

2.2 輸出gggj文件中包含「good」的行

$ awk '/good/' gggj
Xiaosage, white, good/ hen
$

2.3 輸出gggj文件包含「good」行的第一列

$ awk '/good/{print $1}' gggj
Xiaosage,
$

2.4 以逗號為分隔符,輸出gggj的第一和第三列

$ awk -F, '{print$1;print$3}' gggj
Name
Character/ Mom
Xiaosage
good/ hen
Heidashuai
bad/ hen
$

2.5 輸出第2行到第3行的內容,並且加上行號

$ awk 'NR==2,NR==3{print NR,$0}' gggj
2 Xiaosage, white, good/ hen
3 Heidashuai, black, bad/ hen
$

2.6 輸出第1列的內容,並且顯示出欄位數(總列數)

$ awk '{print $1,NF}' gggj
Name, 4
Xiaosage, 4
Heidashuai, 4
$

2.7 通過FS修改分隔符,進行輸出

$ awk -v FS=',' ' {print $1}' gggj
Name
Xiaosage
Heidashuai
$

2.8 通過OFS修改分隔符,輸出第一列和最後一列

$ awk -F "," -v OFS='*****' '{print $1,$NF}' gggj
Name***** Character/ Mom
Xiaosage***** good/ hen
Heidashuai***** bad/ hen
$

三、sed和awk聯用

#查看已經寫好的腳本文件eggs 
$ cat eggs
s/white/flesh-coloured/
s/black/deep purple/
$

3.1 查看sed命令的結果

$ sed -f eggs gggj
Name, Color, Character/ Mom
Xiaosage, flesh-coloured, good/ hen
Heidashuai, deep purple, bad/ hen
$

3.2 默認分隔符,列印第四列

$ sed -f eggs gggj| awk '{print $4}'
Mom
hen
bad/
$

3.3 以逗號為分隔符,列印第二列

$ sed -f eggs gggj | awk -F, '{print $2}'
 Color
 flesh-coloured 
 deep purple
$

3.4 列印全部

$ sed -f eggs gggj | awk -F, '{print}'
Name, Color, Character/ Mom
Xiaosage, flesh-coloured, good/ hen
Heidashuai, deep purple, bad/ hen
$

3.5 使用sort排序

$ sed -f eggs gggj | awk -F, '{print}' | sort
Heidashuai, deep purple, bad/ hen
Name, Color, Character/ Mom
Xiaosage, flesh-coloured, good/ hen
$

四、awk的較高級用法

#查看文件yqlklxy
$ cat yqlklxy
Murong Yunhai,Chu Yuxun,Zhang Han,shiyi
Ye Shuo,Murong Yunduo,Wei Chen,fenshenqingren
Shangguan Ruiqian,xiaoyu,Zhu Zixiao,xiangniandege
Duanmu Lei,Yu xin,Yu Haoming,yigerendelangman
$

4.1 列印角色名和代表歌曲,中間用逗號隔開

#查看腳本文件looklook
$ cat looklook
BEGIN { FS=","}
{print $1","$4}
$

通過變量FS改變欄位分隔符
$ awk -f looklook yqlklxy 
Murong Yunhai,shiyi
Ye Shuo,fenshenqingren
Shangguan Ruiqian,xiangniandege
Duanmu Lei,yigerendelangman
$

4.2 查找含有「Murong」的行,列印「第三列+第四列」

#查看腳本文件cool
$ cat cool
/Murong/ {print $3"+"$4}
$

$ awk -F, -f cool yqlklxy 
Zhang Han+shiyi
Wei Chen+fenshenqingren
$

4.3 使用「~」匹配

#查看腳本文件dool
$ cat dool
$2~ /o/ {print $1"'s girlfriend is "$2"." }
$

$ awk -F, -f dool yqlklxy 
Ye Shuo's girlfriend is Murong Yunduo.
Shangguan Ruiqian's girlfriend is xiaoyu.
$

4.4 使用「!~」反轉

*#查看腳本文件fool
$ cat fool
$2!~ /o/ {print $2"'s boyfriend is "$1"." }
$

$ awk -F, -f fool yqlklxy 
Chu Yuxun's boyfriend is Murong Yunhai.
Yu xin's boyfriend is Duanmu Lei.
$

五、awk處理兩個文件5.1 NR和FNR

$ cat math1
sin0 sin1 sin2
cos0 cos1 cos2
tan0 tan1 tan2
$ cat math2
csc0 csc1 csc2
sec0 sec1 sec2
cot1 cot2 cot3
$

$ awk '{print NR,$0}' math1
1 sin0 sin1 sin2
2 cos0 cos1 cos2
3 tan0 tan1 tan2
$ awk '{print FNR,$0}' math1
1 sin0 sin1 sin2
2 cos0 cos1 cos2
3 tan0 tan1 tan2
$

$awk '{print NR,$0}' math1 math2
1 sin0 sin1 sin2
2 cos0 cos1 cos2
3 tan0 tan1 tan2
4 csc0 csc1 csc2
5 sec0 sec1 sec2
6 cot1 cot2 cot3
$ awk '{print FNR,$0}' math1 math2
1 sin0 sin1 sin2
2 cos0 cos1 cos2
3 tan0 tan1 tan2
1 csc0 csc1 csc2
2 sec0 sec1 sec2
3 cot1 cot2 cot3
$

5.1.1 兩個文件的分隔符相同

$ cat pk1
1 2 3 4 5 6
11 22 33 44 55 66
111 222 333 444 555 666
$ cat pk2
7 8 9 10 J Q
77 88 99 100 JJ QQ
777 888 999 1000 JJJ QQQ
$

$ awk 'NR==FNR{tmp[FNR]=$2;} NR!=FNR{$2=tmp[FNR];print $0}' pk1 pk2>pk12

$ cat pk12
7 2 9 10 J Q
77 22 99 100 JJ QQ
777 222 999 1000 JJJ QQQ
$

5.1.2 兩個文件的分隔符不同

$ cat pk1
1 2 3 4 5 6
11 22 33 44 55 66
111 222 333 444 555 666
$ cat pk3
9:10:J:Q:K:A
99:100:JJ:QQ:KK:AA
999:1000:JJJ:QQQ:KKK:AAA
$

$ awk 'BEGIN{FS="[: ]";OFS=":";}NR==FNR{tmp[FNR]=$2;} NR!=FNR{$2=tmp[FNR];print $0}' pk1 pk3>pk13
$

$ cat pk13
9:2:J:Q:K:A:
99:22:JJ:QQ:KK:AA:
999:222:JJJ:QQQ:KKK:AAA:
$

5.2 合併

$ cat note1
1 You can you
2 No can no
$ cat note2
1 you up
2 no bb
$

$ awk 'NR==FNR{a[$1]=$0;next}NR>FNR{if($1 in a)print a[$1],$3}' note1 note2>note3

$ cat note3
1 You can you up
2 No can no bb
$

5.3 查找缺失行號

$ cat note4
1 Twinkle twinkle little star
2 How I wonder what you are
$ cat note5
1 Twinkle twinkle little star
2 How I wonder what you are
3 Twinkle twinkle little star
4 How I wonder what you are
$

$ awk 'NR==FNR{a[$1]=$0;next}NR>FNR{if(!($1 in a))print $1}' note4 note5>note6
$

$ cat note6
3
4
$

參考

sed 與 awk(第二版)【美】多尓蒂,【美】羅賓斯 著 張旭樂等譯

awk如何處理2個文件 純屬虛構
https://blog.csdn.net/fall221/article/details/8796692?utm_source=app&app_version=4.15.2

awk 合併兩個文件 EllieWong
https://blog.csdn.net/u014102846/article/details/69258170?utm_source=app&app_version=4.15.2

awk之NR==FNR問題 陳浩然MC
https://www.cnblogs.com/irockcode/p/7044722.html

相關焦點

  • shell腳本三劍客--grep、awk、sed
    一、基礎正則表達式1.1基礎正則表達式示例(1)查找特定字符-n 表示顯示行號例如,查找三到五個 o 的連續字符,這個時候就需要使用基礎正則表達式中的限定範圍的字符「{}」。每個大括號前都要加轉義符1.查找兩個e的字符
  • Linux shell腳本編程入門系列七:linux三劍客之awk
    1、awk是什麼?awk命令的作用是進行文本掃描、處理以及報表的生成。awk命令有自己的語法規則,官方說法叫「樣式掃描和處理語言」,其語法借鑑了C語言的精華。由於其強大的文本分析能力與格式化輸出能力,awk命令成為Linux環境開發者的必備殺器,與grep命令、sed命令一起被稱為Linux三劍客。熟練運用awk命令能讓我們的日常工作變得高端同時也高效起來。2、awk的基本使用awk對文本的掃描是以行為單位的,也就是說awk一次從文本中讀取一行的內容。
  • Linux shell awk 流程控制語句(if,for,while,do)詳細介紹
    if 是流程選擇用法。 awk中,流程控制語句,語法結構,與c語言類型。下面是各個語句用法。 一. 二.說明:ENVIRON 是awk常量,是子典型數組。有了這些語句,其實很多shell程序都可以交給awk,而且性能是非常快的。 break當 break 語句用於 while 或 for 語句時,導致退出程序循環。continue當 continue 語句用於 while 或 for 語句時,使程序循環移動到下一個迭代。
  • shell--awk命令
    再次說明, awk 對輸入文件中的每一行都執行這個腳本。二、awk使用數據欄位變量  awk的主要特性之一是處理文本文件中數據的能力,它會自動給每一行中的每個數據元素分配一個變量。除此之外,也可以一次一行地輸入程序腳本命令,比如說:[root@localhost ~]# awk '{> $4="Christine"> print $0}'My name is RichMy name is Christine  在你用了表示起始的單引號後,bash shell 會使用 > 來提示輸入更多數據,
  • Linux 三劍客之 awk 詳解
    [root@creditease awk]# cat /etc/redhat-releaseCentOS Linux release 7.5.1804 (Core)[root@creditease awk]# uname -r3.10.0-862.el7.x86_64[root@creditease awk]# ll `which awk`lrwxrwxrwx
  • Shell 流編輯器 AWK
    一、AWK 簡介AWK 是一種程式語言,用於在
  • awk 系列:如何使用 awk 輸出文本中的欄位和列
    Awk 輸出欄位和列如果你熟悉 Unix/Linux 或者懂得 bash shell 編程[1],那麼你應該知道什麼是內部欄位分隔符(IFS)變量。awk 中默認的 IFS 是制表符和空格。awk 中的欄位分隔符的工作原理如下:當讀到一行輸入時,將它按照指定的 IFS 分割為不同欄位,第一組字符就是欄位一,可以通過 $1 來訪問,第二組字符就是欄位二,可以通過 $2 來訪問,第三組字符就是欄位三,可以通過 $3 來訪問,以此類推,直到最後一組字符。
  • shell三劍客:(一)sed的基礎用法
    目錄一、sed的基礎知識1.1 sed常用參數1.2 sed工作原理1.3 sed使用格式二、sed的基本命令2.1 添加(a,i)2.1.1 在指定行後添加2.1.2 在指定行前插入2.2 刪除(d)2.2.1 刪除qqcy文件最後一行2.2.2 刪除qqcy文件中的第二行到最後一行2.3 替換(c,s)2.3.1  整行替換2.3.2  簡單替換2.3.3 多重替換2.3.4 指定替換
  • linux零基礎學習資料:shell中色彩處理和awk使用技巧
    shell腳本中echo顯示內容帶顏色顯示,echo顯示帶顏色,需要使用參數-e格式1: echo -e 「\033[背景顏色;文字顏色m 要輸出的字符 \033[0m」格式2:echo -e 「\e[背景顏色;文字顏色m要輸出的字符\e[0m」例:綠底藍字注:
  • Linux 三劍客 Awk、Sed、Grep 命令詳解
    Linux三劍客Awk命令詳解命令名稱Awk  pattern scanning and processing language命令作用對文本和數據進行處理awk有很多內建的功能,比如數組、函數等,這是它和C語言的相同之處,靈活性是awk最大的優勢。
  • 一學就會的 5 種 awk 用法
    awk 是流式編輯器,針對文檔中的行來操作,一行一行地執行。awk 可以非常方便、高效地操作文檔以及字符,從而實現我們想要的格式。它的功能非常強大,我在 shell 腳本中經常使用它來處理字符串。下面介紹幾個在工作中使用 awk 較頻繁的用法。1.
  • linux三劍客之awk,linux必學的強大工具!
    awk的概念及作用「awk命名源自於它的三大作者名字的首字母,分別是Alfred Aho、Brian Kernighan、Peter Weinberger。awk是一個強大的文本分析工具,相當於grep的查找和sed的編輯功能,根據分隔符對每行數據切片,切開的部分在進行各種分析處理,處理的數據可以來自標準輸入、一個或多個文件,或其它命令的輸出。常用作腳本使用。
  • Linux Awk用法總結
    Awk、sed與grep,俗稱Linux下的三劍客,它們之前有很多相似點,但是同樣也各有各的特色,相似的地方是它們都可以匹配文本,其中sed和awk還可以用於文本編輯,而grep則不具備這個功用。在awk中,可以通過$1,$2…來訪問對應位置的欄位,同時$0存放整個記錄,這一點有點類似shell下的命令行位置參數。關於這些內容,我們會在下面詳細介紹,這裡你只要知道有這些東西就好。
  • linux Awk命令詳解
    在awk中,文件的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格。2.shell腳本方式將所有的awk命令插入一個文件,並使awk程序可執行,然後awk命令解釋器作為腳本的首行,一遍通過鍵入腳本名稱來調用。 相當於shell腳本首行的:#!/bin/sh 可以換成:#!
  • Linux Awk命令詳解
    2.shell腳本方式將所有的awk命令插入一個文件,並使awk程序可執行,然後awk命令解釋器作為腳本的首行,一遍通過鍵入腳本名稱來調用。 相當於shell腳本首行的:#!/bin/sh 可以換成:#!
  • linux awk命令詳解
    在awk中,文件的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格。 2.shell腳本方式將所有的awk命令插入一個文件,並使awk程序可執行,然後awk命令解釋器作為腳本的首行,一遍通過鍵入腳本名稱來調用。相當於shell腳本首行的:#!
  • Linux 三劍客:awk 入門教程
    之前在 Linux 伺服器上處理一些文件的時候,需要用到 awk,所以就順便把 awk 學了,也就有了這個入門教程。grep 大家應該很熟悉,不過單單掌握 grep 可能不夠用,如果學會 awk 等於你在 Linux 命令行裡,又多了一種處理文本的選擇。awk 與 sed 和 grep,俗稱 Linux 下的三劍客,如果你把這三劍客都給收了,那就穩妥了。
  • 正則表達式(7)-三劍客之awk(2)
    awk的變量和shell一樣,也分為內部變量和自定義變量。awk的「-v」選項用來定義變量或為變量賦值。FS:(field separator)定義輸入分隔符,默認為空格。功能相當於「-F」選項。這是一個數組,ARGV[0]表示awk命令本身,ARGV[1]表示第一個參數,以此類推。
  • Linux——Shell腳本的應用1(基礎)
    Shell腳本的應用(基礎)簡介:隨著linux系統在企業中的應用越來越多,伺服器的自動化管理也變得越來越重要。在linux伺服器的自動化維護工作中,除了計劃任務的設置以外,shell腳本的應用也是非常重要的一部分。
  • Linux 三劍客之 awk 實戰詳解教程
    當然 awk 不僅能做這些事情,當你將它的用法融匯貫通時,可以隨心所欲的按照你的意願,來進行高效的數據分析和統計。=、>、<、>=、<=,其中 $0 表示整行的所有內容。(二)內置變量awk 內置了一些變量,更方便我們對數據的處理