日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

命令 —— awk内置变量(NF,NR,FS,FILENAME)

發布時間:2025/10/17 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 命令 —— awk内置变量(NF,NR,FS,FILENAME) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于awk命令的幾個內置變量(NF,NR,FS,FILENAME)

1.NF:支持記錄域個數,在記錄被讀之后再設置例1

[root@redhat wilsontest]# pwd

/tmp/wilsontest

[root@redhat wilsontest]# echo $PWD | awk -F / '{print $NF}'

wilsontest

這里取得的是當前目錄的最后一個文件的名字。

再如:

[root@redhat wilsontest]# echo "/usr/local/etc/rc.sybase" | awk -F / '{print $NF}'

rc.sybase

-F /表示以’/’分開域

2.NR:已經讀取的記錄數3.FILENAME

定義:支持a w k腳本實際操作的輸入文件。因為a w k可以同時處理許多文件,因此如果訪問了這個變量,將告之系統目前正在瀏覽的實際文件。

?

例如:

[root@redhat wilsontest]# cat filetest

hello wilson

world

linux

oracle

C++

?

[root@redhat wilsontest]# awk '{print NF,NR,$0}END{print FILENAME}' filetest

2 1 hello wilson

1 2 world

1 3 linux

1 4 oracle

1 5 C++

說明:第一列NF輸出讀取記錄的域的個數;NR表示已經讀取的記錄數;$0實際就是把記錄輸出出來;FILENAME就是輸出正在處理的文件。

為了說明FILENAME的作用,再做如下操作:

[root@redhat wilsontest]# cp filetest filetest.bak

[root@redhat wilsontest]# ls -la

total 28

drwxr-xr-x ?2 root root 4096 Oct 26 10:02 .

drwxrwxrwt 11 root root 4096 Oct 26 09:46 ..

-rw-r--r-- ?1 root root ? 36 Oct 26 10:00 filetest

-rw-r--r-- ?1 root root ? 36 Oct 26 10:02 filetest.bak

-rw-r--r-- ?1 root root 4617 Oct 23 09:10 man.config

[root@redhat wilsontest]# awk '{print NF,NR,$0}END{print FILENAME}' filetest filetest.bak

2 1 hello wilson

1 2 world

1 3 linux

1 4 oracle

1 5 C++

2 6 hello wilson

1 7 world

1 8 linux

1 9 oracle

1 10 C++

?

awk中RS,ORS,FS,OFS區別與聯系

學習awk時,一定要記得動手去實踐,只有在實踐中才能發現問題,以下就我在學習中和實踐中的經驗,總結一下RS,ORS,FS,OFS的區別和聯系。

一,RS與ORS

1,RS是記錄分隔符,默認的分隔符是\n,具體用法看下

查看復制打印?

  • [root@krlcgcms01?mytest]#?cat?test1?????//測試文件??
  • ?111?222??
  • ?333?444??
  • ?555?666??
  • 2,RS默認分割符\n

    查看復制打印?

  • [root@krlcgcms01?mytest]#?awk?'{print?$0}'?test1??//awk?'BEGIN{RS="\n"}{print?$0}'?test1?這二個是一樣的??
  • 111?222??
  • 333?444??
  • 555?666??
  • 其實你可以把上面test1文件里的內容理解為,111 222\n333 444\n555 6666,利用\n進行分割。看下一個例子

    3,自定義RS分割符

    查看復制打印?

  • [zhangy@localhost?test]$?echo?"111?222|333?444|555?666"|awk?'BEGIN{RS="|"}{print?$0,RT}'??
  • ?111?222?|??
  • ?333?444?|??
  • ?555?666??
  • 結合上面一個例子,就很容易理解RS的用法了。

    4,RS也可能是正則表達式

    查看復制打印?

  • [zhangy@localhost?test]$?echo?"111?222a333?444b555?666"|awk?'BEGIN{RS="[a-z]+"}{print?$1,RS,RT}'??
  • ?111?[a-z]+?a??
  • ?333?[a-z]+?b??
  • ?555?[a-z]+??
  • 從例3和例4,我們可以發現一點,當RT是利用RS匹配出來的內容。如果RS是某個固定的值時,RT就是RS的內容

    5,RS為空時

    查看復制打印?

  • [zhangy@localhost?test]$?cat?-n?test2??
  • ?1??111?222??
  • ?2??
  • ?3??333?444??
  • ?4??333?444??
  • ?5??
  • ?6??
  • ?7??555?666??
  • [zhangy@localhost?test]$?awk?'BEGIN{RS=""}{print?$0}'?test2??
  • 111?222??
  • 333?444??
  • 333?444??
  • 555?666??
  • [zhangy@localhost?test]$?awk?'BEGIN{RS="";}{print?"<",$0,">"}'?test2??//這個例子看著比較明顯??
  • <?111?222?>??
  • <?333?444?????//這一行和下面一行,是一行??
  • 333?444?>??
  • <?555?666?>??
  • 從這個例子,可以看出當RS為空時,awk會自動以多行來做為分割符

    6,ORS記錄輸出分符符,默認值是\n

    把ORS理解成RS反過程,這樣更容易記憶和理解,看下面的例子。

    查看復制打印?

  • [zhangy@localhost?test]$?awk?'BEGIN{ORS="\n"}{print?$0}'?test1??//awk?'{print?$0}'?test1二者是一樣的??
  • 111?222??
  • 333?444??
  • 555?666??
  • [zhangy@localhost?test]$?awk?'BEGIN{ORS="|"}{print?$0}'?test1??
  • 111?222|333?444|555?666|??
  • 二,FS與OFS

    1,FS指定列分割符

    查看復制打印?

  • [zhangy@localhost?test]$?echo?"111|222|333"|awk?'{print?$1}'??
  • ?111|222|333??
  • [zhangy@localhost?test]$?echo?"111|222|333"|awk?'BEGIN{FS="|"}{print?$1}'??
  • ?111??
  • 2,FS也可以用正則

    查看復制打印?

  • [zhangy@localhost?test]$?echo?"111||222|333"|awk?'BEGIN{FS="[|]+"}{print?$1}'??
  • 111??
  • 3,FS為空的時候

    查看復制打印?

  • [zhangy@localhost?test]$?echo?"111|222|333"|awk?'BEGIN{FS=""}{NF++;print?$0}'??
  • 1?1?1?|?2?2?2?|?3?3?3??
  • 當FS為空的時候,awk會把一行中的每個字符,當成一列來處理

    4,RS被設定成非\n時,\n會成FS分割符中的一個

    查看復制打印?

  • [zhangy@localhost?test]$?cat?test1??
  • ?111?222??
  • ?333?444??
  • ?555?666??
  • [zhangy@localhost?test]$?awk?'BEGIN{RS="444";}{print?$2,$3}'?test1??
  • ?222?333??
  • ?666??
  • 222和333之間是有一個\n的,當RS設定成444后,222和333被認定成同一行的二列了,其實按常規思想是二行的一列才對

    5,OFS列輸出分隔符

    查看復制打印?

  • [zhangy@localhost?test]$?awk?'BEGIN{OFS="|";}{print?$1,$2}'?test1??
  • ?111|222??
  • ?333|444??
  • ?555|666??
  • [zhangy@localhost?test]$?awk?'BEGIN{OFS="|";}{print?$1?OFS?$2}'?test1??
  • ?111|222??
  • ?333|444??
  • ?555|666??
  • test1只有二列,如果100列,都寫出來太麻煩了吧。

    查看復制打印?

  • [zhangy@localhost?test]$?awk?'BEGIN{OFS="|";}{print?$0}'?test1??
  • ?111?222??
  • ?333?444??
  • ?555?666??
  • [zhangy@localhost?test]$?awk?'BEGIN{OFS="|";}{NF=NF;print?$0}'?test1??
  • ?111|222??
  • ?333|444??
  • ?555|666??
  • 為什么第二種方法中的OFS生效呢?個人覺得,awk覺查到列有所變化時,就會讓OFS生效,沒變化直接輸出了。

    參考鏈接 :關于awk命令的幾個內置變量(NF,NR,FS,FILENAME)?:http://blog.51cto.com/wjn219/1227805
    參考鏈接:awk中RS,ORS,FS,OFS區別與聯系 :http://blog.51yip.com/shell/1151.html#

    總結

    以上是生活随笔為你收集整理的命令 —— awk内置变量(NF,NR,FS,FILENAME)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。