day30-awk進階

awk模式種類

awk的模式分為這幾種

  • 正則表達式
    • 基本正則
    • 擴展正則
  • 比較表達式
  • 范圍表達式
  • 特殊模式
    • BEGIN
    • END

awk比較運算符(語法)

關系運算符解釋示例
<小于x<y
<=小于等于x<=y
==等于x==y
!=不等于x!=y
>=大于等于x>=y
>大于x>y
~匹配正則x~/正則/
!~與表達式不匹配x!~/正則/

正則表達式語法(awk模式)

  • 正則表達式作用在于在行數據中匹配想要的字符串、然后執行對應的action動作
  • 支持基本正則、擴展正則
awk '/正則表達式/{print $0}'

再來看一下awk的語法,模式也可以理解為是條件

awk [option] 'pattern[action]'  file ...

awk默認是按行處理文本,如果不指定任何模式(條件),awk默認一行行處理

如果指定了模式,只有符合模式的才會被處理

經典語法圖解

awk正則練習/etc/passwd

創建測試數據

創建用戶
[242-yuchao-class01 root ~]#for i in `seq 10`;do useradd t${i};done刪除用戶
for i in `seq 10`;do userdel -rf t${i};done

awk提取出/etc/passwd 中root用戶行

簡寫
[242-yuchao-class01 root ~]#awk -F ':' '/^root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash或者寫全了動作
[242-yuchao-class01 root ~]#awk -F ':' '/^root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash提取root用戶、以及它的登錄解釋器信息
[242-yuchao-class01 root ~]#awk -F ':' '/^root/{print $1,$NF}' /etc/passwd
root /bin/bash

awk提取出允許登錄的用戶行

[242-yuchao-class01 root ~]#awk -F ':' '/bash$/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
t1:x:1001:1001::/home/t1:/bin/bash
t2:x:1002:1002::/home/t2:/bin/bash
t3:x:1003:1003::/home/t3:/bin/bash
t4:x:1004:1004::/home/t4:/bin/bash
t5:x:1005:1005::/home/t5:/bin/bash
t6:x:1006:1006::/home/t6:/bin/bash
t7:x:1007:1007::/home/t7:/bin/bash
t8:x:1008:1008::/home/t8:/bin/bash
t9:x:1009:1009::/home/t9:/bin/bash
t10:x:1010:1010::/home/t10:/bin/bash

awk提取出用戶名以t開頭的行

方法1
[242-yuchao-class01 root ~]#awk -F ':' '/^t/' /etc/passwd
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
t1:x:1001:1001::/home/t1:/bin/bash
t2:x:1002:1002::/home/t2:/bin/bash
t3:x:1003:1003::/home/t3:/bin/bash
t4:x:1004:1004::/home/t4:/bin/bash
t5:x:1005:1005::/home/t5:/bin/bash
t6:x:1006:1006::/home/t6:/bin/bash
t7:x:1007:1007::/home/t7:/bin/bash
t8:x:1008:1008::/home/t8:/bin/bash
t9:x:1009:1009::/home/t9:/bin/bash
t10:x:1010:1010::/home/t10:/bin/bash方法2
[242-yuchao-class01 root ~]#awk -F ':' '/^t.*/' /etc/passwd

提取出由用戶自己創建的用戶

(uid大于1000)
[242-yuchao-class01 root ~]#awk -F ':' '$3>=1000{print $0}' /etc/passwd
www:x:1000:1000::/home/www:/sbin/nologin
t1:x:1001:1001::/home/t1:/bin/bash
t2:x:1002:1002::/home/t2:/bin/bash
t3:x:1003:1003::/home/t3:/bin/bash
t4:x:1004:1004::/home/t4:/bin/bash
t5:x:1005:1005::/home/t5:/bin/bash
t6:x:1006:1006::/home/t6:/bin/bash
t7:x:1007:1007::/home/t7:/bin/bash
t8:x:1008:1008::/home/t8:/bin/bash
t9:x:1009:1009::/home/t9:/bin/bash
t10:x:1010:1010::/home/t10:/bin/bash(家目錄在/home下的用戶)
[242-yuchao-class01 root ~]#awk '/\/home.*/' /etc/passwd
www:x:1000:1000::/home/www:/sbin/nologin
t1:x:1001:1001::/home/t1:/bin/bash
t2:x:1002:1002::/home/t2:/bin/bash
t3:x:1003:1003::/home/t3:/bin/bash
t4:x:1004:1004::/home/t4:/bin/bash
t5:x:1005:1005::/home/t5:/bin/bash
t6:x:1006:1006::/home/t6:/bin/bash
t7:x:1007:1007::/home/t7:/bin/bash
t8:x:1008:1008::/home/t8:/bin/bash
t9:x:1009:1009::/home/t9:/bin/bash
t10:x:1010:1010::/home/t10:/bin/bash

提取出禁止登錄的用戶

對bash的解釋器行,結果取反對最后一個字段進行正則匹配
awk -F ':' '$NF!~/bash$/{print $0}' /etc/passwd對所有字段正則匹配
awk -F ':' '$0!~/bash$/{print $0}' /etc/passwd指定找出nologin的行
[242-yuchao-class01 root ~]#awk -F ':' '/nologin/{print $0}' /etc/passwd

awk正則提取ip

1.指定行號,提取ip
[242-yuchao-class01 root ~]#ifconfig ens33 | awk 'NR==2{print $2}'
192.168.0.2422.指定分隔符提取ip
[242-yuchao-class01 root ~]#ifconfig ens33 | awk -F 'inet|netmask' 'NR==2{print $2}'192.168.0.242

?

?

判斷常用服務端口是否存活

提取出http和ssh服務的端口方法1,指定對第四列字段進行正則匹配,是否存在22或80端口
[242-yuchao-class01 root ~]#netstat -tunlp|awk '$4~/22|80/{print $0}'
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7040/nginx: master
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      900/sshd
tcp6       0      0 :::80                   :::*                    LISTEN      7040/nginx: master
tcp6       0      0 :::22                   :::*                    LISTEN      900/sshd方法2,整行匹配,偷懶寫法
[242-yuchao-class01 root ~]#netstat -tunlp|awk '/22|80/'
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7040/nginx: master
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      900/sshd
tcp6       0      0 :::80                   :::*                    LISTEN      7040/nginx: master
tcp6       0      0 :::22                   :::*                    LISTEN      900/sshd

提取/etc/passwd的10~20行

要求且顯示行號

[242-yuchao-class01 root ~]#awk 'NR>=10&&NR<=20{print NR,$0}' /etc/passwd
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15 dbus:x:81:81:System message bus:/:/sbin/nologin
16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
18 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
19 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
20 nginx:x:998:996:Nginx web server:/var/lib/nginx:/sbin/nologin

awk范圍模式

  • 可以用到正則
  • 可以用到比較運算符

范圍模式就是從某一行到某一行,均是符合條件的行。

語法
awk '/regex1/,/regex2/{action}' yuchao.log

顯示root行到mail用戶的行

處理/etc/passwd

且顯示行號

[242-yuchao-class01 root ~]#awk '/^root/,/^mail/{print NR,$0}' /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

顯示bin用戶到第五行

且顯示行號

[242-yuchao-class01 root ~]#awk '/^bin/,NR==5{print NR,$0}' /etc/passwd
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

awk特殊模式BEGIN和END

BEGIN模式

  • BEGIN模式作用是在awk開始讀取文件行數據、之前就先執行,一般用于預定義一些操作,比如數據的表頭格式化等。
  • BEGIN后面必須跟上action動作

BEGIN打印

顯示/etc/passwd前五行,且打印BEGIN動作

[242-yuchao-class01 root ~]#awk 'BEGIN{print "于超老師正在帶你學習awk"}NR<=5{print $0}' /etc/passwd
于超老師正在帶你學習awk
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

awk格式化打印/etc/passwd

提取root、mail、nobody三個用戶信息

  • 名字
  • 家目錄
  • 登錄解釋器

且設置好表頭(格式化打印)

?

[242-yuchao-class01 root ~]#awk -F ':' 'BEGIN{print "用戶名","家目錄","解釋器"}$1~/(root|mail|nobody|t5)/{print $1,$6,$NF}' /etc/passwd |column -t
用戶名  家目錄           解釋器
root    /root            /bin/bash
mail    /var/spool/mail  /sbin/nologin
nobody  /                /sbin/nologin
t5      /home/t5         /bin/bash

BEGIN簡單玩法

只打印

處理數據之前的動作

[242-yuchao-class01 root ~]#awk 'BEGIN{print "于超老師帶你學linux"}'
于超老師帶你學linux
計算器
[242-yuchao-class01 root ~]#awk 'BEGIN{print 10/3}'
3.33333[242-yuchao-class01 root ~]#awk 'BEGIN{print 10/3+2*3}'
9.33333
awk自定義變量

數值變量

[242-yuchao-class01 root ~]#awk 'BEGIN{x=3;y=8;print x*y}'
24

字符串變量

[242-yuchao-class01 root ~]#awk 'BEGIN{name="于超";print name,"正在教你學linux"}'
于超 正在教你學linux

END模式

  • 和BEGIN相反,END就是awk結束后的操作
  • END是awk讀取完所有的文件后,再執行END模塊,一般用來總結、格式化打印一個結果

  • END僅會在awk所有行數據處理完畢后,執行END動作。

簡單打印

[242-yuchao-class01 root ~]#awk -F ':' 'BEGIN{print "超哥帶你學linux"}NR<=5{print NR,$0}END{print "學完了,講的不錯"}' /etc/passwd
超哥帶你學linux
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
學完了,講的不錯

計算/etc/passwd行數

顯示/etc/passwd的用戶名、登錄解釋器、且在結尾顯示行數。

[242-yuchao-class01 root ~]#awk -F ':' '{print $1,$NF}END{print "總行數:",NR}' /etc/passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
games /sbin/nologin
ftp /sbin/nologin
nobody /sbin/nologin
systemd-network /sbin/nologin
dbus /sbin/nologin
polkitd /sbin/nologin
tss /sbin/nologin
sshd /sbin/nologin
postfix /sbin/nologin
nginx /sbin/nologin
www /sbin/nologin
t1 /bin/bash
t2 /bin/bash
t3 /bin/bash
t4 /bin/bash
t5 /bin/bash
t6 /bin/bash
t7 /bin/bash
t8 /bin/bash
t9 /bin/bash
t10 /bin/bash
總行數: 31

統計如下數據,有多少空行

測試數據

[242-yuchao-class01 root ~]#cat t1.log -n1    I am teacher yuchao.2    I teach linux,python!34    I like english56    My website is http://yuchaoit.cn7    Our school site is https://apecome.com8    My qq num is 877348180910111213    #my qq num is not  8777777333334444488881118888000014    #15    #Goog good study , day day up!

統計空行數,用到了awk的變量功能

awk變量計數器
變量用法
num+=1 
意思是 num=1 ; num=num+1
定義num變量,當做計數器,awk每處理一行,計數器就加一

實踐

[242-yuchao-class01 root ~]#awk '{num+=1;print "num的值是",num}' t1.log
num的值是 1
num的值是 2
num的值是 3
num的值是 4
num的值是 5
num的值是 6
num的值是 7
num的值是 8
num的值是 9
num的值是 10
num的值是 11
num的值是 12
num的值是 13
num的值是 14
num的值是 15

統計空行數(END總結)

[242-yuchao-class01 root ~]#awk '/^$/{num+=1;print $0}END{print "文件空行數是:",num}' t1.log文件空行數是: 6

可以省去打印的動作、直接統計

[242-yuchao-class01 root ~]#awk '/^$/{num+=1}END{print "文件空行數是:",num}' t1.log
文件空行數是: 6

END計算器

面試題,用awk計算 1+2+3+...+50

答案

[242-yuchao-class01 root ~]#seq 1 50 | awk '{i+=$0}END{print "1到50疊加總和是:",i}'
1到50疊加總和是: 1275

圖解、查看awk計算的過程

?

模式總結

  • awk核心就是模式、動作、找到數據之后要干什么
  • 模式就是awk的查找條件
    • 正則表達式模式、
    • 條件表達式,比較大小、是否相等
    • 范圍表達式,從哪一行,找到哪一行
  • 以及awk的特殊模式,設定開始前、結束后的條件+動作
    • BEGIN
    • END

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64970.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64970.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64970.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大語言模型(LLM)一般訓練過程

大語言模型(LLM)一般訓練過程 數據收集與預處理 收集:從多種來源收集海量文本數據,如互聯網的新聞文章、博客、論壇,以及書籍、學術論文、社交媒體等,以涵蓋豐富的語言表達和知識領域。例如,訓練一個通用型的LLM時,可能會收集數十億甚至上百億字的文本數據.清洗:去除…

數據庫新建用戶后(Host:%),報錯:localhost無法連接

存在問題 在給數據庫&#xff08;MySQL、MariaDB等&#xff09;創建了新的用戶名&#xff08;eg&#xff1a;maxscale&#xff09;后&#xff0c;無法使用新用戶名登錄&#xff0c;并報如下錯誤&#xff1a;ERROR 1045 (28000): Access denied for user maxscalelocalhost (us…

2024年大型語言模型(LLMs)的發展回顧

2024年對大型語言模型&#xff08;LLMs&#xff09;來說是充滿變革的一年。以下是對過去一年中LLMs領域的關鍵進展和主題的總結。 GPT-4的壁壘被打破 去年&#xff0c;我們還在討論如何構建超越GPT-4的模型。如今&#xff0c;已有18個組織擁有在Chatbot Arena排行榜上超越原…

數據挖掘——支持向量機分類器

數據挖掘——支持向量機分類器 支持向量機最小間隔面推導基于軟間隔的C-SVM非線性SVM與核變換常用核函數 支持向量機 根據統計學習理論&#xff0c;學習機器的實際風險由經驗風險值和置信范圍值兩部分組成。而基于經驗風險最小化準則的學習方法只強調了訓練樣本的經驗風險最小…

檢索增強生成

概述 檢索增強生成&#xff08;Retrieval-Augmented Generation&#xff0c;RAG&#xff09;是一種將信息檢索與語言模型相結合的技術。由Facebook AI Research于2020年提出&#xff0c;它把數據庫的優勢與語言模型的優勢相結合。它能讓模型從外部知識庫中檢索信息&#xff0c…

在 SQL 中,區分 聚合列 和 非聚合列(nonaggregated column)

文章目錄 1. 什么是聚合列&#xff1f;2. 什么是非聚合列&#xff1f;3. 在 GROUP BY 查詢中的非聚合列問題示例解決方案 4. 為什么 only_full_group_by 要求非聚合列出現在 GROUP BY 中&#xff1f;5. 如何判斷一個列是聚合列還是非聚合列&#xff1f;6. 總結 在 SQL 中&#…

ETL處理工具Kettle入門

1. Kettle簡介 Kettle&#xff08;現已更名為Pentaho Data Integration&#xff0c;簡稱PDI&#xff09;是一個開源的ETL工具&#xff0c;能夠進行數據的抽取&#xff08;Extract&#xff09;、轉換&#xff08;Transform&#xff09;和加載&#xff08;Load&#xff09;。它是…

petalinux2017.4對linux4.9.0打實時補丁

準備工作&#xff1a; 1.windows&#xff1a;安裝vivado 2017.4&#xff0c;xilinx sdk 2017.4 2.ubuntu16.04&#xff1a;安裝petalinux 2017 3.黑金ax7020&#xff0c;sd卡 一、準備linux內核的操作系統 1.1 Petalinux配置 Petalinux使用教程-CSDN博客非常詳細&#xf…

Maven 教程之 pom.xml 詳解

Maven 教程之 pom.xml 詳解 pom.xml 簡介 什么是 pom POM 是 Project Object Model 的縮寫,即項目對象模型。 pom.xml 就是 maven 的配置文件,用以描述項目的各種信息。 pom 配置一覽 <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi

Golang的緩存一致性策略

Golang的緩存一致性策略 一致性哈希算法 在Golang中&#xff0c;緩存一致性策略通常使用一致性哈希算法來實現。一致性哈希算法能夠有效地解決緩存節點的動態擴容、縮容時數據重新分布的問題&#xff0c;同時能夠保證數據訪問的均衡性。 一致性哈希算法的核心思想是將節點的哈希…

【機器學習:一、機器學習簡介】

機器學習是當前人工智能領域的重要分支&#xff0c;其目標是通過算法從數據中提取模式和知識&#xff0c;并進行預測或決策。以下從 機器學習概述、有監督學習 和 無監督學習 三個方面進行介紹。 機器學習概述 機器學習定義 機器學習&#xff08;Machine Learning&#xff0…

藍橋杯JAVA--003

需求 2.代碼 public class RegularExpressionMatching {public boolean isMatch(String s, String p) {if (p.isEmpty()) {return s.isEmpty();}boolean firstMatch !s.isEmpty() && (s.charAt(0) p.charAt(0) || p.charAt(0) .);if (p.length() > 2 && p…

被催更了,2025元旦源碼繼續免費送

“時間從來不會停下&#xff0c;它只會匆匆流逝。抓住每一刻&#xff0c;我們才不會辜負自己。” 聯系作者免費領&#x1f496;源&#x1f496;碼。 三聯支持&#xff1a;點贊&#x1f44d;收藏??留言&#x1f4dd;歡迎留言討論 更多內容敬請期待。如有需要源碼可以聯系作者免…

WebRTC的線程事件處理

1. 不同平臺下處理事件的API&#xff1a; Linux系統下&#xff0c;處理事件的API是epoll或者select&#xff1b;Windows系統下&#xff0c;處理事件的API是WSAEventSelect&#xff0c;完全端口&#xff1b;Mac系統下&#xff0c;kqueue 2. WebRTC下的事件處理類&#xff1a; …

關于Zotero

1、文獻數據庫&#xff1a; Zotero的安裝 Zotero安裝使用_zotero只能安裝在c盤嗎-CSDN博客 2、如何使用zotero插件 我剛下載的時候就結合使用的是下面的這兩個博主的分享&#xff0c;感覺暫時是足夠的。 Zotero入&#x1f6aa;基礎 - 小紅書 Green Frog申請easyscholar密鑰…

企業三要素如何用PHP實現調用

一、什么是企業三要素&#xff1f; 企業三要素即傳入的企業名稱、法人名稱、社會統一信用代碼或注冊號&#xff0c;校驗此三項是否一致。 二、具體怎么樣通過PHP實現接口調用&#xff1f; 下面我們以阿里云為例&#xff0c;通過PHP示例代碼進行調用&#xff0c;參考如下&…

Go 語言中強大的配置管理庫—Viper

Viper 是 Go 語言中強大的配置管理庫&#xff0c;廣泛用于云原生和微服務開發中。它支持多種配置文件格式&#xff08;如 YAML、JSON、TOML 等&#xff09;、環境變量、命令行參數以及遠程配置管理。 Viper 的主要功能 1. 支持多種格式的配置文件&#xff1a; ? YAML、JSON…

鴻蒙-封裝loading動畫

import { AnimatorOptions, AnimatorResult } from "kit.ArkUI" export enum SpinImageType { RedLoading, WhiteLoading } Component export struct SpinImage { Prop type?: SpinImageType Prop url?: string State animatedValue: number 0 …

今日復盤103周五(189)

1、早上&#xff0c;看了一下二手書里的十種主要游戲類型的相關內容。 其實收獲不大&#xff0c;主要是引發思考。 2、白天&#xff0c;持續多日的模式1的白模原型關卡結束&#xff0c;開始轉做準正式資源的關卡&#xff0c; 但進度低于預期。 并不是改改參數那么簡單輕松&a…

OJ隨機鏈表的復制題目分析

題目內容&#xff1a; 138. 隨機鏈表的復制 - 力扣&#xff08;LeetCode&#xff09; 分析&#xff1a; 這道題目&#xff0c;第一眼感覺非常亂&#xff0c;這是正常的&#xff0c;但是我們經過仔細分析示例明白后&#xff0c;其實也并不是那么難。現在讓我們一起來分析分析…