偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

AWK 不再難:案例驅(qū)動(dòng)學(xué)習(xí),讓你成為數(shù)據(jù)處理高手

開發(fā)
AWK 是一個(gè)靈活且強(qiáng)大的工具,通過以下案例,我們可以看到它在實(shí)際數(shù)據(jù)處理中所帶來的便利。

在數(shù)據(jù)處理領(lǐng)域,AWK 是一個(gè)強(qiáng)大而靈活的工具,盡管很多人對(duì)它感到陌生或畏懼。本文將通過實(shí)際案例,幫助你逐步掌握 AWK 的基本用法,讓你在數(shù)據(jù)處理方面游刃有余。

案例1:使用awk提取文本

1.問題

本案例旨在通過運(yùn)用awk工具實(shí)現(xiàn)以下目標(biāo):

  • 熟練掌握awk工具的基礎(chǔ)操作與語法。
  • 從系統(tǒng)中提取關(guān)鍵信息,包括但不限于網(wǎng)絡(luò)接口的流量數(shù)據(jù)、根文件系統(tǒng)的剩余空間容量,以及記錄嘗試通過SSH協(xié)議進(jìn)行遠(yuǎn)程連接但未成功的IP地址列表。
  • 對(duì)/etc/passwd文件中的內(nèi)容進(jìn)行處理,以結(jié)構(gòu)化格式展示用戶的登錄名(用戶名)、用戶標(biāo)識(shí)號(hào)(UID)及其主目錄路徑等信息。

2.解答

AWK是一種文本處理工具,能夠讀取輸入行并根據(jù)指定模式進(jìn)行操作。它的基本語法如下:

awk 'pattern { action }' filename

在編輯指令中,print 是最常用的一個(gè)。當(dāng)需要執(zhí)行多條編輯指令時(shí),可以使用分號(hào)進(jìn)行分隔。此外,Awk 在過濾數(shù)據(jù)時(shí)支持僅輸出特定列的數(shù)據(jù),例如第二列或第五列等。在處理文本的過程中,如果沒有明確指定字段分隔符,則默認(rèn)情況下 awk 會(huì)將空格和制表符視為字段之間的分隔標(biāo)志。

(1) 結(jié)合管道過濾獲取每個(gè)分區(qū)的剩余容量信息

(2) 選項(xiàng)-F指定分隔符

輸出passwd文件中以分號(hào)分隔的第1、7個(gè)字段,顯示的不同字段之間以逗號(hào)隔開,操作如下:

為了提取passwd文件中以分號(hào)分隔的第一和第七個(gè)字段,可以執(zhí)行以下命令:

awk -F : '{print $1,$7}' /etc/passwd

執(zhí)行上述命令后,輸出如下圖的結(jié)果

awk常用內(nèi)置變量:

  • $1文本的第1列
  • $2文件的第2列
  • $3文件的第3列,依此類推
  • NR 文件當(dāng)前行的行號(hào)
  • NF文件當(dāng)前行的列數(shù)(有幾列)

利用awk提取本機(jī)的網(wǎng)絡(luò)流量、根分區(qū)剩余容量、獲取遠(yuǎn)程失敗的IP地址。

通過ifconfig eth0查看網(wǎng)卡信息,其中包括網(wǎng)卡流量:

RX為接收的數(shù)據(jù)量,TX為發(fā)送的數(shù)據(jù)量。packets以數(shù)據(jù)包的數(shù)量為單位,bytes以字節(jié)為單位,為了直觀把字節(jié)轉(zhuǎn)成兆。

root@pve:~# ifconfig vmbr0 | awk '/RX packets/{print $5/1024/1024 " MB"}'
180.912 MB
root@pve:~# ifconfig vmbr0 | awk '/TX packets/{print $5/1024/1024 " MB"}'
2491.94 MB

提取根分區(qū)剩余容量,通過df命令查看根分區(qū)的使用情況,其中包括剩余容量:

root@pve:~# df -h /
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/pve-root   68G   27G   38G  42% /

輸出上述結(jié)果中最后一行的第4列:

root@pve:~# df -h / | tail -1 | awk '{print $4}'
38G

根據(jù)/var/log/auth.log日志文件,通過正則方式進(jìn)行過濾遠(yuǎn)程連接密碼失敗的IP地址,并統(tǒng)計(jì),執(zhí)行如下命令:

awk '/Failed/{match($0, /([0-9]{1,3}\.){3}[0-9]{1,3}/, arr); if (arr[0]) print arr[0]}' \
/var/log/auth.log | sort | uniq -c

執(zhí)行上述命令后,輸出如下結(jié)果:

案例2:awk處理?xiàng)l件

1.問題

在本案例中,需運(yùn)用awk工具執(zhí)行以下過濾任務(wù)。請(qǐng)?zhí)貏e注意awk處理?xiàng)l件的設(shè)定:

  • 提取并展示用戶ID(UID)位于1至1000范圍內(nèi)的所有用戶的詳細(xì)信息。
  • 從/etc/hosts文件中篩選出以127或192開頭的所有記錄行。
  • 構(gòu)建一個(gè)列表,包含100以內(nèi)所有是7的倍數(shù)或者數(shù)字本身含有7的所有整數(shù)。

2.解答

(1) 使用正則設(shè)置條件

輸出其中以bash結(jié)尾的完整記錄:

root@didiplus:~# awk -F: '/bash$/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

請(qǐng)篩選出那些登錄Shell字段(即第七個(gè)字段)不以"nologin"結(jié)尾的用戶記錄,并展示這些用戶的用戶名及其對(duì)應(yīng)的登錄Shell信息。具體來說,可以采用對(duì)第七個(gè)字段進(jìn)行反向匹配(!~)的方式來實(shí)現(xiàn)這一需求。

root@didiplus:~# awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd
root /bin/bash
sync /bin/sync
pollinate /bin/false
tss /bin/false
lxd /bin/false
1panel /bin/sh

(2) 使用數(shù)值/字符串比較設(shè)置條件

在Shell腳本中,常用的比較運(yùn)算符包括:

整數(shù)比較:

  • -lt:小于
  • -le:小于或等于
  • -eq:等于
  • -ne:不等于
  • -gt:大于
  • -ge:大于或等于

字符串比較:

  • ==:等于
  • !=:不等于
  • >:大于
  • <:小于
  • >=:大于或等于
  • <=:小于或等于

這些運(yùn)算符用于條件判斷,以實(shí)現(xiàn)邏輯控制和流程管理。

輸出第3行(行號(hào)NR等于3)的用戶記錄:

root@didiplus:~# awk -F: 'NR==3{print}' /etc/passwd
bin:x:2:2:bin:/bin:/usr/sbin/nologin

輸出賬戶UID大于等于1000的賬戶名稱和UID信息:

root@didiplus:~# awk -F: '$3>=1000{print $1,$3}' /etc/passwd
nobody 65534
1panel 1000

(3) 邏輯測(cè)試條件

輸出賬戶UID大于10并且小于20的賬戶信息:

root@didiplus:~# awk -F: '$3>10 && $3<20' /etc/passwd
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin

(4) 數(shù)學(xué)運(yùn)算

統(tǒng)計(jì)3的倍數(shù)的數(shù)量

root@didiplus:~# seq 200 | awk '$1%3==0{i++} END{print i}'
66

(5) 完成任務(wù)要求的awk過濾操

列出UID間于1~1000的用戶詳細(xì)信息:

awk -F: '$3>=1 && $3<=1000' /etc/passwd

執(zhí)行上述命令后,輸出如下結(jié)果:

輸出 /etc/hosts 映射文件內(nèi)以127或者192開頭的記錄:

root@didiplus:~# awk -F: '/^(127|192)/' /etc/hosts
127.0.0.1       localhost
127.0.1.1       Aliyun

列出100以內(nèi)整數(shù)中7的倍數(shù)或是含7的數(shù):

 seq 100 | awk '$1%7==0||$1~/7/{print}'

$1~/7/:這個(gè)條件使用正則表達(dá)式檢查數(shù)字中是否包含字符“7”。如果是,條件為真。

案例3:awk綜合腳本應(yīng)用

1.問題

本案例要求開發(fā)一個(gè)名為 getupwd-awk.sh 的腳本,以滿足以下功能需求:

  • 識(shí)別并篩選出使用 bash 作為登錄 Shell 的本地用戶。
  • 對(duì)于這些選定的用戶,提取他們?cè)?nbsp;/etc/shadow 文件中的密碼記錄。
  • 將結(jié)果格式化為“用戶名 --> 密碼記錄”的形式,并按行保存至 getupwd.log 文件中。最終輸出格式應(yīng)如下圖所示。

2.解答

根據(jù)需求編寫getupwd-awk.sh,內(nèi)容如下:

#!/bin/bash

# 定義輸出文件
output_file="getupwd.log"

# 清空輸出文件
> "$output_file"

# 獲取使用 bash 作為登錄 Shell 的本地用戶
awk -F: '$7 == "/bin/bash" {print $1}' /etc/passwd | while read -r user; do
    # 獲取該用戶的密碼記錄
    passwd_record=$(sudo grep "^$user:" /etc/shadow)
    
    # 如果找到了密碼記錄,格式化并輸出
    if [ -n "$passwd_record" ]; then
        echo "$user --> $passwd_record" >> "$output_file"
    fi
done

echo "密碼記錄已保存到 $output_file"

案例4:awk擴(kuò)展應(yīng)用

1.問題

在解析Web日志文件時(shí),首列顯示了客戶端的IP地址。由于存在大量重復(fù)的IP地址,僅用awk提取這些信息還不夠,還需要統(tǒng)計(jì)每個(gè)IP地址出現(xiàn)的次數(shù)并對(duì)結(jié)果排序。

為此,可以使用awk創(chuàng)建一個(gè)關(guān)聯(lián)數(shù)組,以IP地址為鍵值。每當(dāng)遇到相同的IP地址時(shí),對(duì)應(yīng)的計(jì)數(shù)器加一,從而計(jì)算出每個(gè)IP地址的總出現(xiàn)次數(shù)。

對(duì)于排序結(jié)果,建議使用sort命令配合不同的參數(shù)來滿足需求。例如,使用-n選項(xiàng)按數(shù)值升序排列,-r選項(xiàng)實(shí)現(xiàn)降序排列,而-k則允許根據(jù)特定字段排序。這一系列步驟有助于從原始日志中有效提取并展示有用的信息。

2.解答

統(tǒng)計(jì)Web訪問量排名:

(1) 提取IP地址及訪問量:

awk '{ip[$1]++} END{for(i in ip) {print i,ip[i]}}' \
/opt/1panel/apps/openresty/openresty/www/sites/didiplus.kwpmp.cn/log/access.log

執(zhí)行上述命令后,輸出如下結(jié)果:

(2) 對(duì)上一步的結(jié)果根據(jù)訪問量排名:

awk '{ip[$1]++} END{for(i in ip) {print i,ip[i]}}' \
/opt/1panel/apps/openresty/openresty/www/sites/didiplus.kwpmp.cn/log/access.log \
sort -nr -k 2

命令 sort -nr -k 2 的含義如下:

  • **-n**:按照數(shù)值大小進(jìn)行排序,而不是字典順序。
  • **-r**:進(jìn)行逆序排序,從大到小。
  • **-k 2**:指定根據(jù)第二列進(jìn)行排序

總結(jié)

AWK 是一個(gè)靈活且強(qiáng)大的工具,通過以上案例,你可以看到它在實(shí)際數(shù)據(jù)處理中所帶來的便利。無論是提取信息、計(jì)算統(tǒng)計(jì),還是格式化輸出,AWK 都能輕松應(yīng)對(duì)。通過案例驅(qū)動(dòng)的學(xué)習(xí)方法,你會(huì)發(fā)現(xiàn) AWK 不再難,反而是提升數(shù)據(jù)處理能力的得力助手。

責(zé)任編輯:趙寧寧 來源: 攻城獅成長日記
相關(guān)推薦

2023-09-21 22:19:03

Python編程語言

2012-04-25 23:00:05

App Store

2009-12-02 16:32:42

Linux高手

2025-01-20 15:06:42

2024-05-16 13:03:54

JSONCrack處理數(shù)據(jù)可視化

2024-05-08 14:05:03

時(shí)間序列數(shù)據(jù)

2009-11-20 09:31:47

Linux命令命令行Linux

2025-04-09 00:01:05

2019-08-27 17:32:10

數(shù)據(jù)處理PandasPython

2020-11-19 16:48:47

數(shù)據(jù)庫開源開發(fā)

2020-03-02 17:03:32

深度學(xué)習(xí)人工智能機(jī)器學(xué)習(xí)

2015-05-05 11:18:18

大數(shù)據(jù)Hadoop技術(shù)處理

2024-06-25 15:35:53

LangChain轉(zhuǎn)換鏈

2009-02-18 10:17:06

Java學(xué)習(xí)要點(diǎn)JSP

2023-08-30 09:16:38

PandasPython

2022-11-17 11:52:35

pandasPySpark大數(shù)據(jù)

2015-11-03 09:31:07

自學(xué)高手數(shù)據(jù)分析

2014-07-17 15:05:49

阿里云ODPS數(shù)據(jù)處理

2025-05-06 08:21:35

2015-10-08 10:04:39

Python高手
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)