Shell筆記:字符串提取


本文講的字符串提取指的是從文件或某個輸出中提取符合條件的列的內容,如果某個文件或輸出中它的每一行的信息都是使用特定的分隔符來分割的話,就可以使用字符串的提取功能,本文涉及到的命令包括cut、printf、awk、sed等。

 

cut命令
cut [選項] 文件名:在文件中提取符合條件的列。
選項:

  • -f 列號:提取第幾列,提取多列只需要將列號用逗號隔開即可。
  • -d 分隔符:按照指定分隔符分割列,如果分割符使用的是制表符tab,則不用特地指定分隔符,且對於cut命令來說,不能使用空格來作為分隔符。

示例:“cut -d ":" -f 1,3 /etc/passwd”表示使用分號作為分隔符分割文檔后提取第一列和第三列的內容。

 

printf格式化輸出
平常使用字符串輸出時使用cat或echo命令即可,printf命令只是在AWK編程中比較常用,在平常的使用中並不常用。AWK編程中,會有print命令和printf命令,但是printf是Linux的標准輸出命令,但是它默認沒有輸出換行符,而print在Linux命令中是沒有的,且默認會自動輸出換行符。
printf "輸出類型和格式" 輸出內容:格式化輸出字符串(使用單引號或者雙引號都行)。
輸出類型:

  • %ns:輸出字符串,n是數字,表示輸出多少個字符。
  • %ni:輸出整數,n是數字,表示輸出多少個數字。
  • %m.nf:輸出浮點數。m和n是數字,表示輸出的整數位數和小數位數。

輸出格式:

  • \a:輸出警告聲音。
  • \b:輸出退格鍵。
  • \f:清除屏幕。
  • \n:換行。
  • \r:回車。
  • \t:水平制表符。
  • \v:垂直制表符。

 

AWK命令
AWK命令因為功能強大且復雜,所以通常也稱為AWK編程,但是它的作用也是用來提取指定的列。
awk命令可以自動識別空格分隔的字符串(即使每列分隔的空格數不同也行),但cut命令就不可以。
awk '條件1{動作1} 條件2{動作2}...' 文件名:提取符合條件的字符串,也可以使用管道符的結果作為文件內容。
常用條件:

  • x>10:判斷x是否大於10。
  • x>=10:大於等於。
  • x<=10:小於等於。
  • BEGIN:在執行文件內容的所有動作之前先執行這個命令。
  • END:在執行完所有動作之后執行這個命令。

常用動作:

  • 格式化輸出。
  • 流程控制語句。
  • FS:指定分割符,如BEGIN{FS=":"}以冒號作為分割符,通常會和BEGIN配合使用,不然第一行字符串不會被分割處理。

示例:
awk '{printf $2 "\t" $6 "\n"}' test.txt:輸出文件中所有內容的第2列和第6列,第2列和第6列之間使用制表符分隔,並且第6列之后輸出換行符(這里的printf如果換為print,就可以不用指定換行符了)。
df -h | grep sda5 | awk '{print $5}':查詢分區信息中包含sda5的行,並輸出這些行的第5列(可以自動以空格作為分隔符。)

 

sed命令
sed其實就是一個輕量級的流編輯器,sed命令主要用來進行數據的選取、替換、刪除、新增。
sed和vim等編輯器的區別在於,vim操作的對象是一個文件,sed操作的對象不僅可以是文件,也可以是其他命令的結果或管道符輸出的結果。
sed [選項] '[動作]' 文件名:處理輸出並輸出到屏幕或文件。
選項:

  • -n:一般sed命令會把所有數據都輸出到屏幕,如果加入此選項,則只會把經過sed命令處理的行輸出到屏幕。
  • -e:允許對輸入數據應用多條sed命令編輯,多個命令之間使用分號隔開。
  • -i:用sed的修改結果直接修改讀取數據的文件,而不是輸出到屏幕(如果是處理文件,還是建議使用vim等編輯器而不是使用-i選項)。

動作:

  • a \:追加,在指定行后追加一行或多行數據,使用\表示達到換行效果(它本身表示數據還未輸出完,換一行繼續輸出),如“sed '2a hello \ welcome' test.txt”表示在這個文件中第2行之后追加兩行數據hello和welcome。
  • c \:行替換,使用指定的字符串替換原來的數據行,想要將指定行替換為多行的數據,同樣使用\即可。
  • i \:插入,在指定行之前插入一行或多行數據。
  • d:刪除指定行。
  • p:打印指定行,如“sed -n '2p'”表示只打印第2行,注意p選項一般和n一起使用,因為不加-n的話默認會先輸出全部數據,然后再額外輸出p選項指定的行,但這樣的效果肯定不會是我們想要的。
  • s:字符串替換,格式為“sed '[n]s/舊字符串/新字符串/g' 文件名”,如果不指定n則表示文件全部內容,如果想要指定多行,則行號之間使用逗號隔開即可,如“sed '3s/99/55/g' test.txt”表示將文件中第3行中的99替換為55。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM