Linux筆記12——shell編程基礎-6

字符截取命令

一、cut命令

功能:用于從文件或標準輸入中提取指定字段或列

語法:cut [選項] 文件名

  • -f:列號,提取第幾列,默認識別制表符分割出來的列(列號之間用,隔開)
  • -d:分隔符,按照指定的分隔符進行分割,然后結合-f提取指定列
  • -c:字符范圍,不依賴分隔符,通過字符范圍進行提取(n-m:從第n個提取到第m個字符;n-:從第n個字符開始提取到結尾;-m:從第1個字符提取到第m個字符)
1.準備測試數據
[root@localhost ~]# cat cut.txt 
ID	NAME	LINUX	MYSQL	DOCKER
0	xzhao	95	59	78
1	xqian	83	75	93
2	xsun	74	96	632.用-f選項過濾指定列的內容
[root@localhost ~]# cut -f 2,5 cut.txt
NAME	DOCKER
xzhao	78
xqian	93
xsun	63
#cut只能分割用制表符分開列的文件,若列是用其他符號分割的,需要用-d選項指定3.通過-d指定分隔符的方式過濾指定文件的第7列
[root@localhost ~]# cut -d: -f 7 /etc/passwd
/bin/bash
/sbin/nologin4.獲取當前所在路徑的最后一個層級目錄
[root@localhost ~]# pwd 
/root
[root@localhost ~]# pwd | cut -d/ -f 2
root#-c 可以按照字符數量進行截取,按照對應格式可以取到對應位置的字符
#截取多個范圍的字符時用,隔開
5.用-c選項截取指定范圍的列
[root@localhost ~]# head -n 5 anaconda-ks.cfg 
# Generated by Anaconda 34.25.4.9
# Generated by pykickstart v3.32
#version=RHEL9
# Use graphical install
graphical
[root@localhost ~]# head -n 5 anaconda-ks.cfg | cut -c 1-5
# Gen
# Gen
#vers
# Use
graph

二、awk命令

功能:對文件進行行提取和列提取

格式:awk ‘條件{動作}’ 文件名

  1. 條件的作用:通過指定條件過濾出符合條件的行,沒有指定則是操作所有行
  2. 動作的作用:通過動作將符合條件的行打印出來,打印時可選擇打印該行中的哪些列

注:條件控制行,動作控制列

例:awk? '{print 列}'? 文件名? 或? awk? '{printf 列}'? 文件名——(不換行)

  • awk的內置參數$n:n=0表示所有列,n=1表示第一列......
  • 從printf打印輸出可以看出,awk的工作原理是一行一行去處理的
  • NF:這行的列數(固定);$NF可以去每列的最后一行;$(NF-1)可以取倒數第二列
  • FS:用來聲明awk的分隔符,如BEGIN{FS=":"};或-F指定分隔符
  • NR:當前行(變化),即awk 'NR==2{print $2"\t"$4}' 文件名
#不指定任何條件,直接執行動作,并選擇輸出哪些列,常用printf來打印
1.等價cut,截取第2列和第5列的值
[root@localhost ~]# awk '{print $2"\t"$5}' cut.txt 
NAME	DOCKER
xzhao	78
xqian	93
xsun	632.讀取文件中任意一列的數據
[root@localhost ~]# awk '{printf $1"\t" $2"\t" $3"\n"}' cut.txt
ID	NAME	LINUX
0	xzhao	95
1	xqian	83
2	xsun	74
[root@localhost ~]# awk '{printf $0 "\n"}' cut.txt
ID	NAME	LINUX	MYSQL	DOCKER
0	xzhao	95	59	78
1	xqian	83	75	93
2	xsun	74	96	63#NF
3.讀取文件每行的總列數
[root@localhost ~]# awk '{print NF}' cut.txt
5
5
5
5
4.獲取文件的最后一列
[root@localhost ~]# awk '{print $NF}' cut.txt
DOCKER
78
93
63
5.獲取文件的倒數第二列
[root@localhost ~]# awk '{print $(NF-1)}' cut.txt
MYSQL
59
75
96
6.獲取文件的第一列和最后一列
[root@localhost ~]# awk '{print $1"\t"$NF}' cut.txt
ID	DOCKER
0	78
1	93
2	63#FS或-F,FS條件直接使用沒有辦法正常匹配第一行,需要用到BEGIN;默認分隔符是空白
7.讀取/etc/passwd的第一列和最后一列
[root@localhost ~]# awk '{FS=":"}{print $1 "\t" $NF}' /etc/passwd
root:x:0:0:root:/root:/bin/bash	root:x:0:0:root:/root:/bin/bash
bin	/sbin/nologin
daemon	/sbin/nologin
adm	/sbin/nologin
lp	/sbin/nologin
sync	/bin/sync
.....................
[root@localhost ~]# awk -F: '{print $1 "\t" $NF}' /etc/passwd
root	/bin/bash
bin	/sbin/nologin
daemon	/sbin/nologin
adm	/sbin/nologin
.....................
[root@localhost ~]# awk 'BEGIN{FS=":"}{print $1 "\t" $NF}' /etc/passwd
root	/bin/bash
bin	/sbin/nologin
daemon	/sbin/nologin
adm	/sbin/nologin
lp	/sbin/nologin#NR條件
8.截取磁盤的使用率
[root@localhost ~]# df -h | awk '{print $5}'
已用%
0%
0%
2%
12%
13%
0%
9.截取磁盤的使用率的數據部分
[root@localhost ~]# df -h | awk 'NR>1{print $5}'
0%
0%
2%
12%
13%
0%
10.截取根分區的磁盤使用率
[root@localhost ~]# df -h | awk 'NR==5{print $5}'
12%
11.截取根分區磁盤使用率的數字部分
[root@localhost ~]# df -h | awk 'NR==5{print $5}' | cut -d% -f1
12

三、awk的條件

1.自定義條件

  • 關系運算條件(>,<,>=,<=,==,!=):用來判斷左右兩側的關系
  • 包含匹配條件(~,!~,~//,!~//):用來進行匹配包含關系的,支持正則
1.列出所有行號大于1的行的列數據
[root@localhost ~]# awk 'NR>1{print $0}' cut.txt 
0	xzhao	95	59	78
1	xqian	83	75	93
2	xsun	74	96	632.列出學號為2的各科成績單
[root@localhost ~]# awk '$1==2{print $0}' cut.txt 
2	xsun	74	96	633.列出LINUX成績大于等于80的成績單
[root@localhost ~]# awk '$3>=80{print $2"\t"$3}' cut.txt 
NAME	LINUX
xzhao	95
xqian	834.獲取當前用戶使用的網卡名
[root@localhost ~]# ip add | grep "inet[^6]" | grep -v "127" | awk '{print $NF}'
ens1605.列出第二列包含字符q的數據
[root@localhost ~]# awk '$2~"q"{print $0}' cut.txt 
1	xqian	83	75	936.列出第二列以字符n結尾的數據
[root@localhost ~]# awk '$2~"n$"{print $0}' cut.txt 
1	xqian	83	75	93
2	xsun	74	96	637.列出包含數字3的數據
[root@localhost ~]# awk '$0~"3"{print $0}' cut.txt 
1	xqian	83	75	93
2	xsun	74	96	63
或
[root@localhost ~]# awk '$0~/3/{print $0}' cut.txt 
或
[root@localhost ~]# awk '/3/{print $0}' cut.txt 8.列出以.com結尾的數據
[root@localhost ~]# awk '/\.com$/{print $0}' cut.txt 

2.預定義條件

  • BEGIN:在awk未讀取數據前聲明的條件
  • END:在awk處理完所有數據后聲明的條件
[root@localhost ~]# awk 'BEGIN{printf "MYSQL成績單:\n"} {printf $2"\t"$4"\n"}' cut.txt
MYSQL成績單:
NAME	MYSQL
xzhao	59
xqian	75
xsun	96[root@localhost ~]# awk '{printf $2"\t"$5"\n"}END{printf "以上顯示的是所有人的DOCKER成績\n"}' cut.txt
NAME	DOCKER
xzhao	78
xqian	93
xsun	63
以上顯示的是所有人的DOCKER成績

  1. 若有多個條件(動作),可以用空格分隔
  2. 在包含匹配中,若想使用特殊字符的轉義態,需要使用~//符號,不能直接用“”
  3. 可以用“”的地方一定可以用//,但可以用//的地方不一定可以用“”
  4. awk在使用的時候可能會存在一些格式上的問題
  5. awk {print $3+$4},還可以做運算

四、動作(printf)

功能:printf是標準的格式化輸出,取消所有默認格式,然后手動指定輸出內容的類型和輸出時的格式

格式:printf? '類型/格式'? 字符串

輸出類型

  • %s:將內容按照字符串類型輸出(如:ns代表輸出寬度是n,默認右對齊,-ns是左對齊)
  • %i:將內容按照整數類型輸出(如:ni代表輸出的寬度是n,默認右對齊,-ns是左對齊)
  • %f:將內容按浮點數類型輸出(如%.2f,保留兩位小數,四舍五入)

輸出格式

  • \t:字符之間用制表符分割,即tab鍵
  • \n:字符之間用換行符分割,即enter鍵
  • 注:輸出格式需要加雙引號
1.使用printf輸出表格文件
[root@localhost ~]# printf %s $(cat cut.txt)
IDNAMELINUXMYSQLDOCKER0xzhao9559781xqian8375932xsun749663[root@localhost ~]# 
#在使用printf輸出時,如果僅指定輸出類型,而不指定輸出格式,則會把所有要輸出內容連在一起輸出,變
為一整行[root@localhost ~]# printf '%s\t%s\t%s\t%s\t%s\n' $(cat cut.txt)
ID	NAME	LINUX	MYSQL	DOCKER
0	xzhao	95	59	78
1	xqian	83	75	93
2	xsun	74	96	632.在輸出時,想讓第1列使用整數類型輸出,3,4,5列使用浮點類型輸出
[root@localhost ~]# printf '%i\t%s\t%.2f\t%.2f\t%.2f\n' $(cat cut.txt|grep -v ID)
0	xzhao	95.00	59.00	78.00
1	xqian	83.00	75.00	93.00
2	xsun	74.00	96.00	63.003.打印名字和Linux成績,且成績保留2位小數
[root@localhost ~]# printf '%s\t%.2f\n' $(awk 'NR>1{printf $2"\t"$3"\n"}' cut.txt)
xzhao	95.00
xqian	83.00
xsun	74.004.計算每個人的平均值
[root@localhost ~]# awk 'NR>1{printf $2"的平均分是\t"($3+$4+$5)/3"\n"}' cut.txt
xzhao的平均分是	77.3333
xqian的平均分是	83.6667
xsun的平均分是	77.6667
#awk中默認支持數值運算,并且整數、浮點數運算都支持

字符截取命令練習

問題1:監控當前根分區的使用情況(若根分區使用率超過10%,打印紅色超標)

[root@localhost ~]# cat jiance.sh 
#!/bin/bash
usage=$(df -h | awk '$NF~/\/$/{print $(NF-1)}' | cut -d% -f1)
[ $usage -gt 10 ] && echo -e "\e[31m 超標 \e[0m"
[root@localhost ~]# bash jiance.sh 超標 
[root@localhost ~]#

問題2:列出第二列包含x的行的第2列和第4列(cut.txt)

[root@localhost ~]# cat cut.txt 
ID	NAME	LINUX	MYSQL	DOCKER
0	xzhao	95	59	78
1	xqian	83	75	93
2	xsun	74	96	63
[root@localhost ~]# awk '$2~"x"{print $2"\t"$4}' cut.txt 
xzhao	59
xqian	75
xsun	96
或
[root@localhost ~]# awk '$2~/x/{print $2"\t"$4}' cut.txt 

問題3:提取IP地址的網段(ip add)

[root@localhost ~]# ip add | grep "inet[^6]"inet 127.0.0.1/8 scope host loinet 192.168.66.66/24 brd 192.168.66.255 scope global noprefixroute ens160
[root@localhost ~]# ip add | grep "inet[^6]" | grep -v "127"inet 192.168.66.66/24 brd 192.168.66.255 scope global noprefixroute ens160
[root@localhost ~]# ip add | grep "inet[^6]" | grep -v "127" | awk '{print $2}'
192.168.66.66/24
[root@localhost ~]# ip add | grep "inet[^6]" | grep -v "127" | awk '{print $2}' | cut -d. -f3
66
[root@localhost ~]#

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

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

相關文章

高效瀏覽器標簽頁管理:Chrome擴展開發完全指南

Hi&#xff0c;我是前端人類學&#xff08;之前叫布蘭妮甜&#xff09;&#xff01; 在信息過載的時代&#xff0c;瀏覽器標簽頁管理已成為提高工作效率的關鍵技能。本文將介紹如何開發一個功能完整的Chrome擴展&#xff0c;幫助用戶高效管理瀏覽器標簽頁&#xff0c;并探討其實…

從 WPF 到 Avalonia 的遷移系列實戰篇3:ResourceDictionary資源與樣式的差異與遷移技巧

從 WPF 到 Avalonia 的遷移系列實戰篇3:ResourceDictionary資源與樣式的差異與遷移技巧 我的GitHub倉庫Avalonia學習項目包含完整的Avalonia實踐案例與代碼對比。 我的gitcode倉庫是Avalonia學習項目。 文中主要示例代碼均可在倉庫中查看&#xff0c;涵蓋核心功能實現與優化方案…

基于Springboot的音樂媒體播放及周邊產品運營平臺(有報告)。Javaee項目,springboot項目。

演示視頻&#xff1a; 基于Springboot的音樂媒體播放及周邊產品運營平臺&#xff08;有報告&#xff09;。Javaee項目&#xff0c;springboot項目。項目介紹&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09…

【項目思維】嵌入式產業鏈與技術生態

這篇文章深入解析嵌入式產業鏈與技術生態上下游關系&#xff0c;輔助建立嵌入式工程師職業發展認知。嵌入式行業并不是“寫單片機程序”那么簡單&#xff0c;而是一個 從芯片設計到系統集成再到最終產品落地 的復雜生態鏈。理解上下游價值鏈&#xff0c;有助于你成為系統型工程…

機器學習(講解)

一、引言&#xff1a;什么是監督學習&#xff1f;監督學習&#xff08;Supervised Learning&#xff09;是機器學習中最基礎且應用最廣泛的范式之一。其核心思想是利用已標記的數據&#xff08;即輸入-輸出對&#xff09;訓練模型&#xff0c;使其能夠對新的、未標記的數據進行…

使用 Bright Data Web Scraper API + Python 高效抓取 Glassdoor 數據:從配置到結構化輸出全流程實戰

使用 Bright Data Web Scraper API Python 高效抓取 Glassdoor 數據&#xff1a;從配置到結構化輸出全流程實戰 摘要 本文詳細介紹了如何使用 Bright Data 的 Web Scraper API 搭配 Python&#xff0c;實現對 Glassdoor 平臺信息的高效抓取。通過 API 請求構建器、反爬機制集成…

Burgan Bank Türkiye 如何借助 Elastic 改造可觀測性和安全性

作者&#xff1a;來自 Elastic Jon Ashley, Ido Friedman, Burak Dz Burgan Bank Trkiye Burgan Bank K.P.S.C. 是科威特項目公司 (KIPCO) 集團的子公司&#xff0c;成立于 1977 年&#xff0c;是中東和北非 (MENA) 地區最大的控股集團和重要銀行集團之一。 該銀行作為客戶的解…

LeetCode 165. 比較版本號 - 優雅Java解決方案

文章目錄LeetCode 165. 比較版本號 - 優雅Java解決方案題目描述示例分析示例 1示例 2示例 3算法思路Java實現方案方案一&#xff1a;雙指針法&#xff08;推薦&#xff09;方案二&#xff1a;優化的單次遍歷法可視化執行過程示例&#xff1a;compareVersion("1.2", &…

基于Kubernetes StatefulSet的有狀態微服務部署與持久化存儲實踐經驗分享

基于Kubernetes StatefulSet的有狀態微服務部署與持久化存儲實踐經驗分享 在傳統微服務架構中&#xff0c;大多數服務都是無狀態的&#xff08;Stateless&#xff09;&#xff0c;可以通過 Deployment、ReplicaSet 等控制器實現水平自動擴縮容。但在生產環境中&#xff0c;仍有…

MySQL編程開發

變量系統變量&#xff1a;MySQL內置變量#查看所有系統變量show variables \G;#通過模糊查詢篩選變量show variables like “%path%”;全局變量&#xff1a;在所有終端中都生效&#xff1b;會話變量&#xff1a;在當前會話&#xff08;本次登錄&#xff09;&#xff1b;#可以通過…

20250830_Oracle 19c CDB+PDB(QMS)默認表空間、臨時表空間、歸檔日志、閃回恢復區巡檢手冊

PDB 關業務,CDB 管底層;每天緊盯 PDB,必要時看 CDB。 一、CDB 與 PDB 的關系 Oracle 12c 以后引入 多租戶架構(Multitenant),分成兩類容器: 層級 名稱 作用 存儲內容 典型操作 CDB CDB$ROOT(容器數據庫) 數據庫實例的根容器 Oracle 元數據、系統表字典、公共用戶、PDB…

什么是MIPS架構?RISC-V架構?有什么區別?【超詳細初學者教程】

什么是MIPS架構&#xff1f;RISC-V架構&#xff1f;有什么區別&#xff1f;【超詳細初學者教程】 關鍵詞&#xff1a;MIPS架構&#xff0c;RISC-V架構&#xff0c;精簡指令集RISC&#xff0c;嵌入式系統&#xff0c;CPU架構對比&#xff0c;指令集架構&#xff0c;開源處理器&…

IDEA Spring屬性注解依賴注入的警告 Field injection is not recommended 異常解決方案

一、異常錯誤 在使用 IntelliJ IDEA 進行 Spring 開發時&#xff0c;當使用 Autowired 注解直接在字段上進行依賴注入時&#xff0c;IDE 會顯示黃色警告&#xff1a; Field injection is not recommended這個警告出現在以下代碼模式中&#xff1a; Service public class UserSe…

智能核心:機器人芯片的科技革新與未來挑戰

在人工智能與機器人技術深度融合的今天&#xff0c;機器人芯片作為驅動智能機器的“大腦”&#xff0c;正成為科技競爭的戰略制高點。這一微小卻至關重要的硬件&#xff0c;決定了機器人的計算能力、響應速度與智能水平&#xff0c;是機器人從“自動化”邁向“自主化”的關鍵所…

經典掃雷游戲實現:從零構建HTML5掃雷游戲

一、引言 掃雷是一款經典的單人益智游戲&#xff0c;起源于20世紀60年代&#xff0c;并在90年代隨著Windows操作系統的普及而風靡全球。本文將詳細介紹如何使用現代網頁技術&#xff08;HTML、CSS和JavaScript&#xff09;從零開始構建一個功能完整的掃雷游戲。我們將涵蓋游戲邏…

ccache編譯加速配置

ccache 介紹 ccache(“compiler cache”的縮寫)是一個編譯器緩存,該工具會高速緩存編譯生成的信息,并在編譯的特定部分使用高速緩存的信息, 比如頭文件,這樣就節省了通常使用 cpp 解析這些信息所需要的時間。 github :https://github.com/ccache/ccache home:https://c…

數據庫主鍵選擇策略分析

為什么不推薦使用數據庫自增主鍵&#xff1f;分庫分表問題&#xff1a;自增ID在分庫分表場景下會導致ID沖突需要額外機制(如步長設置)來保證全局唯一&#xff0c;增加系統復雜度安全性問題&#xff1a;自增ID容易暴露業務量(如訂單號連續)可能被惡意爬取數據分布式系統限制&…

線性代數理論——狀態空間的相關概念以及由系統的輸入輸出導出狀態空間描述

線性代數理論——狀態空間 狀態&#xff1a;動態系統的狀態就是指系統的過去、現在、將來的運動狀況&#xff0c;精確的說就是狀態需要一組必要而充分的數據來表明。 狀態變量&#xff1a;可以表達系統運動狀態的變量都是狀態變量。 狀態變量組&#xff1a;可以完全表征系統在時…

【GaussDB】排查應用高可用切換出現數據庫整體卡頓及報錯自治事務無法創建的問題

【GaussDB】排查應用高可用切換出現數據庫整體卡頓及報錯自治事務無法創建的問題 背景 某客戶在做應用程序的高可用切換測試&#xff0c;在應用程序中&#xff0c;收到了來自數據庫的報錯&#xff0c;不能創建自治事務 ERROR: autonomous transaction failed to create auton…

shell腳本第五階段---shell函數與正則表達式

學習目標掌握case語句的基本語法結構掌握函數的定義以及調用掌握常用的正則表達式元字符含義一、case語句case語句為多選擇語句。可以用case語句匹配一個值與一個模式&#xff0c;如果匹配成功&#xff0c;執行相匹配的命令。case var in 定義變量&#xff1b;var代表變量名…