awk基本用法

一、awk介紹

    awk、sed&grep都可以匹配文本,但sed和awk可以對文本進行編輯,grep則不具有此功能;sed是非交互式的流編輯器,而awk則是一門模式匹配的編程語言。awk主要用于處理匹配的文本,同時awk還支持編程語言的一些特性,如變量、函數、循環語句等。   

二、基本用法

       1)awk [options] 'program' File1,File2…

       program:Pattern{Action Statements}

       program通常位于單引號中,多個action語句之間用逗號分隔。

2)awk [options] 'BEGIN{ action;… } pattern{ action;… } END{action;… }' file …

       常用action:print printf

       常用options:

       -F:指明輸入時用到的字段分隔符

       -v var=value:聲明變量

三、awk的工作原理

       1)在處理文本之前,若存在BEGIN語句塊,則先執行此語句塊中的語句。

       2)將輸入的文本或標準輸入按回車(\n)分割,解析為多個記錄(record,默認以\n分隔,記錄的分割符可以同過awk的內置變量RS來更改)。

       3)記錄會被切割成多個字段(filed,默認情況下,以空白字符切割不同的字段,包括空格和制表符,字段的分隔符可以通過-F選項及awk內置變量FS來指定),并將第一個字段存放在$1中,第二個字段存放在$2中,倒數第二個字段存放在$(NF-1),最后一個字段存放在$NF中。$0則表示匹配到的整條記錄。

       4)如果讀取到的記錄與pattern想匹配,則執行器指定的action;若不匹配,則跳過action,直到完成所有的語句。

       5)當以條輸入記錄處理完成之后,繼續讀取下一條記錄,重復上面的動作,直到處理完全部的輸入。若果輸入的是文件列表,awk將按順序處理列表中的文件。

       6)awk處理完所有的輸入之后,若存在END語句塊,則執行END語句塊中的語句。

       BEGIN、END語句都是可選的。

四、awk調用方式

主要有三種調用方式,分別為:

       1) awk命令行

       可以在命令行中使用awk 程序設計語言,也可以在shell script 程序中引用awk 命令行甚至awk 程序腳本。

       2) 使用-f 選項調用awk 程序

       awk 允許將一段awk 程序寫入一個文本文件,然后在awk 命令行中用-f 選項調用并執行這段程序。

       3) 利用命令解釋器調用awk 程序

       利用命令解釋器功能,我們可以將一段awk 程序寫入文本文件,然后在它的第一行加上#!/bin/awk –f.

五、awk使用詳解

1、print:用于輸出指定的內容

print item,item2,…

要點:

1)逗號分隔多個item

       2)輸出的各item可以為字符串,也可以是數值、當前記錄的字段、變量、awk表達式

       3)如省略item,相當于print $0,即輸出被pattern匹配的記錄。

例:在系統上每個用戶名之前加上hello

blob.png

例:

blob.png

2、printf命令

用于格式化輸出:printf Format,item1,item2,….

1)Format 必須給出

2)不會自動換行,需要給出換行控制符,\n

3)Format中需要分別為后面的每個item指定一個格式化符號。

格式符:

       %c:不現實字符本身,而是顯示字符的ASCII碼

       %d,%i:顯示十進制整數

       %e,%E:以科學記數法數值顯示

       %f:顯示為浮點數

       %g,%G:以科學記數法或浮點數形式顯示數值。

       %u:無符號整數

       %s:顯示為字符串

       %%:顯示%自身

例:顯示用戶名及其ID

blob.png

blob.png

  修飾符:對格式符進行修飾

              #[.#]:第一個數字控制顯示的寬度(度量值:字符數),第二個表示小數點后的精度

              %3.1f

              :左對齊

              +:右對齊。默認為右對齊

例:在上例中,由于用戶名的長度長短不一,在輸出時不夠清晰。使用修飾符能讓輸出更具易讀性。

左對齊:

]#awk -F: '{printf "username is: %-15s;userid is %i\n",$1,$3}' /etc/passwd

blob.png

右對齊:

]#awk -F: '{printf "Your name is %+15s,your id is %i\n",$1,$3}' /etc/passwd

blob.png

3、變量

3.1 內建變量

       FS:input field separator,指定輸入時的字段分隔符;默認為空白字符

       OFS:output field separator:指定輸出時的字段分隔符;默認為空白字符

       RS:input record separator:指定輸入時的換行符;默認為空白

       ORS:output record separator:指定輸出時的換行符,默認為空白

       NF:number of field,每行的字段數量

              {print NF}

              $NF 標識最后一個字段

       NR:number of record,文件的行的數量

       FNR:若awk處理多個文件,則每個文件分別統計行數。若不指定,所有文件累計行數。

       FILENAME:當前文件名

       ARGC:命令行參數的

       ARGV:數組,保存的是命令行所給定的各參數

例:用FS指定字段分隔符,注意,在awk中,每個變量之前需要用-v來指定。

blob.png

例:指定輸出的字段分隔符。

blob.png

blob.png

3.2 自定義變量

       (1)-v var=value

              注意:變量名區分大小寫

       (2)在program中直接定義

blob.png

blob.png

4、操作符

       算術操作符:+ ,- ,* ,/ ,%, ^

              -n::轉換為負數

              +n:將字符串轉換為數值

       字符串操作符:沒有符號的操作符,表示連接字符串

       賦值操作符:= ,+= ,-= ,*= ,/= ,^= ,%= ,++ ,–

       比較操作符:< ,> ,<= ,>= ,==, !=

       模式操作符:

              ~:左側的字符串是否被右側的模式所匹配

              !~:左側的字符串是否被右側的模式不匹配

       邏輯操作符: && || !

       函數調用:function_name(argu1,argu2…)

       條件表達式:selector?if-true-expression:if-false-expression

例:使用條件表達式判斷用戶是普通用戶還是系統用戶或管理員

awk -F: '{$3>1000?usertype="Common user":usertype="System or Sysadmin";printf "%15s:%s\n",$1,usertype}' /etc/passwd

blob.png

5、PATTERN

5.1)empty:空模式,匹配每一行

5.2)/Regular Expression/:僅處理被模式匹配的每一行

例:輸出/etc/fstab文件中不是以UUID開頭的行的第一個字段。

      輸出/etc/fstab文件中以UUID開頭的行的第一個字段。

blob.png

5.3)relational expression:關系表達式;結果有“真”有“假”;結果為真的才被處理。

真:結果為非0值表示為真,非空字符串也表示為真

假:0表示為假,空字符串也表示為假

例:

         1)輸出uid大于1000的用戶的用戶名

       2)輸出小于等于1000的用戶的用戶名

       3)輸出shell為/bin/bash的用戶的用戶名及其shell

blob.png

blob.png

5.4)line ranges:指定行范圍

       startline,endline:/part1/,/part2/

       注意:不支持直接給出數字的格式。

例:查找/etc/passwd文件中root到shutdown用戶之間個用戶的用戶名及uid。

]#awk -F: '/^root\>/,/^shutdown\>/{print $1,$3}' /etc/passwd

blob.png

例:輸出/etc/passwd中從第2行(不包括第2行)到第10行(包括第10行)的用戶名及其UID

blob.png

5.5)BEGIN/END模式

       BEGIN{}BEGIN 語句塊在awk 開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通??梢詫懺贐EGIN語句塊。  END{}END 語句塊在awk 從輸入流中讀取完所有的行之后即被執行,比如打印所有行的分析結果這類信息匯總都是在END 語句塊中完成,它也是一個可選語句。

例:

]#awk -F: 'BEGIN{print "   usernameuid\n--------------------"}{print $1,$3}END{print "-----------------\n        end        " }' /etc/passwd

blob.png

blob.png

原創文章,作者:M20-1鐘明波,如若轉載,請注明出處:http://www.www58058.com/48228

(0)
M20-1鐘明波M20-1鐘明波
上一篇 2016-09-21
下一篇 2016-09-21

相關推薦

  • Xtrabackup進行MySQL備份

    使用Xtrabackup進行MySQL備份 一、安裝 1、簡介 Xtrabackup是由percona提供的mysql數據庫備份工具,據官方介紹,這也是世界上惟一一款開源的能夠對innodb和xtradb數據庫進行熱備的工具。 特點: (1)備份過程快速、可靠; (2)備份過程不會打斷正在執行的事務; (3)能夠基于壓縮等功能節約磁盤空間和流量; (4)自動…

    Linux干貨 2017-02-20
  • linux文件管理類命令

    stat、alias、xargs命令使用;(非)字母,(非)數字的表示方法。

    2017-12-11
  • linux重裝grub,并且設置多重引導

    一、利用linux安裝盤(U盤,或者光盤等),啟動計算機 二、選擇troubleshotting==》Rescue a Centos system==》Continue 三、在shell中輸入如下命令     chroot /mnt/sysimage     grub2-install /dev/vda   …

    Linux干貨 2017-04-28
  • N28-第四周博客作業

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。

    2、編輯/etc/group文件,添加組hadoop。

    3、手動編輯/etc/passwd文件新增一行,添加用戶hadoop,其基本組ID為hadoop組的id號;其家目錄為/home/hadoop。

    4、復制/etc/skel目錄為/home/hadoop,要求修改hadoop目錄的屬組和其它用戶沒有任何訪問權限。

    5、修改/home/hadoop目錄及其內部所有文件的屬主為hadoop,屬組為hadoop。

    6、顯示/proc/meminfo文件中以大寫或小寫S開頭的行;用兩種方式;

    7、顯示/etc/passwd文件中其默認shell為非/sbin/nologin的用戶;

    8、顯示/etc/passwd文件中其默認shell為/bin/bash的用戶;

    9、找出/etc/passwd文件中的一位數或兩位數;

    10、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行;

    11、顯示/etc/rc.d/rc.sysinit文件中以#開頭,后面跟至少一個空白字符,而后又有至少一個非空白字符的行;

    12、打出netstat -tan命令執行結果中以‘LISTEN’,后或跟空白字符結尾的行;

    13、添加用戶bash, testbash, basher, nologin (此一個用戶的shell為/sbin/nologin),而后找出當前系統上其用戶名和默認shell相同的用戶的信息;

    Linux干貨 2017-12-26
  • LINUX下用戶管理命令簡述

    LINUX下用戶管理命令簡述 添加用戶并設置密碼 useradd [用戶名] 創建用戶 [root@localhost ~]# useradd jack [root@localhost ~]# cat /etc/shadow | grep jack jack:!!:17257:0:99999:7::: passwd [用戶名] 設置密碼 [root@loca…

    Linux干貨 2017-04-05
  • 第一周作業

    1、描述計算機的組成及其功能。
    2、按系列羅列Linux的發行版,并描述不同發行版之間的聯系與區別。
    3、描述Linux的哲學思想,并按照自己的理解對其進行解釋性描述。
    4、說明Linux系統上命令的使用格式;詳細介紹ifconfig、echou、tty、startx、export、pwd、history、shutdown、poweroff、reboot、hwclock、date命令的使用,并配合相應的示例來闡述。
    5、如何在Linux系統上獲取命令的幫助信息,請詳細列出,并描述man文檔的章節是如何劃分的。
    6、請羅列Linux發行版的基礎目錄名稱命名法則及共用規定。

    Linux干貨 2017-12-03
欧美性久久久久