shell字符串截取总结
shell中截取字符串的方法有很多中,本人對其中幾種常用的進行整理總結。
0x01、grep
在文件中搜尋字符串匹配的行并輸出
Linux系統中grep命令是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹 配的行打印出來。grep全稱是Global Regular Expression Print,表示全局正則表達式版本,它的使用權限是所有用戶。
grep 【選項】【指定字串】【文件】
-i 不區分大小寫
-v 排除指定字串
-c:只輸出匹配行的計數。
-n:顯示匹配行及 行號。
-s:不顯示不存在或無匹配文本的錯誤信息。
grep支持正則表達式,下面總結下正則表達式和通配符。
正則表達式
正則表達式用來在文件中匹配符合條件的字符串,正則表達式是包含匹配。grep、awk、sed等命令可以支持正則表達式。
通配符
通配符用來匹配符合條件的文件名,通配符是完全匹配,ls、find、cp這些命令不支持正則表達式,所以只能使用shell自己的通配符來進行匹配。
?
正則有些符號和通配符有些符號通用,但含義完全不同
?
基礎正則表達式
| 元字符 | 作用 |
| * | 前一個字符匹配0次或任意多次 |
| . | 匹配除了換行符外任意一個字符 |
| ^ | 匹配行首。如^hello會匹配以hello開頭的行 |
| $ | 匹配行尾,如hello會匹配以hello結束的行 |
| [] | 匹配中括號中任意的一個字符,只匹配一個字符。 |
| [^] | 匹配除中括號的字符以外的任意一個字符。如[^0-9]匹配任意一個非數字字符 |
| \ | 轉義符。用于取消特殊符號的含義 |
| {n} | n是一個非負數,匹配前面的字符恰好出現n次。如o{2}匹配food中的兩個o |
| {n,} | 表示其前面的字符出現不少于n次 |
| {n,m} | 最少匹配n次且最多匹配m次 |
?
| 1 2 | 需要注意的是,通配符的*表示任意字符,而正則表達式的*是匹配錢一個字符0次或者任意多次 grep?"s*"?anaconda-ks.cfg??顯示的不是包含有s的行,而是顯示了整個文件,“s*”匹配s的0次或多次 |
| 1 | grep?"size*"?anaconda-ks.cfg匹配了e的0次或多次,但至少需匹配siz字符串 |
| 1 | “.”匹配除了換行符外任意一個字符,和通配符的?相同,“.*”就才和通配符中的“*”作用相同 |
grep提取行,cut和awk提取列
?
0x02、cut
cut是一個選取命令,就是將一段數據經過分析,取出我們想要的。一般來說,選取信息通常是針對“行”來進行分析的,并不是整篇信息分析的
cut[選項]?文件名
-f列號提取第幾列
-d分隔符按照指定分隔符分割列(默認使用的是制表符tab鍵)
| 1 | 和grep結合使用,cat?/etc/passwd?|?grep?/bin/bash?|?grep?-v?root?|?cut?-d":"?-f?1 |
cut命令的局限線
cut命令對于空格符分割,不能很好的提取,可以使用awk命令解決
0x03、awk
和cut命令作用一樣,截取符合條件的列,grep是截取符合條件的行,但cut有些局限,awl也可以通過制表符,冒號等分隔符截取,功能遠比cut強大,但awk是一個非常復雜的命令,不但可以實現字符串的截取,還可以在awk命令中進行編程調用,最常見的可以進行函數,判斷等。所以把awk一直說是awk編程。但僅僅是簡單的截取列,又不是用空格作分割的話,cut命令更簡單。
?
awk是一個強大的文本分析工具,相對于grep的查找,sed的編輯,awk在其對數據分析并生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。
?
?
awk?‘條件1{動作1}條件2{動作2}...’文件名
條件
一般使用關系表達式作為條件
x>10判斷變量x是否大于10
x>=10大于等于
x<=10小于等于
?
動作
格式化輸出
流程控制語句
$1代表第一列,$2代表第二列,$0代表整一行
?
?
?
FS內置變量
| 1 2 | awk?'{FS=":"}{print?$1"\t"?$3}'?/etc/passwd,使用FS=””,指定分割符,第一行已經讀完,用冒號分割已經來不及了,默認的用空格分割,后面的用冒號分割,在 FS之前強制加個BEGIN |
?
關系運算符
?
| 1 | cat?/etc/passwd?|?awk?'{FS=":"}?$3>=500?{printf?$1"\n"}' |
0x04、printf
printf是在awk中的標準輸出格式
?printf ‘輸出類型輸出格式’輸出內容
輸出類型:
%ns:輸出字符串,n是數字指代輸出幾個字符
%ni:輸出是整數,n是數字指代輸出幾個數字
%m.nf:輸出浮點數。m和n是數字,指代輸出的整數位數和小數位數。加%8.2f代表共輸出8位數,其中2位是小數,6位是整數。
?
輸出格式:
\a:輸出警告聲音
\b:輸出退格符,也就是backspace鍵
\f:清楚屏幕
\n:換行
\r:回車,也就是Enter鍵
\t:水平輸出退格鍵,也就是Tab鍵
\v:垂直輸出退格鍵,也就是Tab鍵
在awk命令的輸出中支持print和printf命令
print:print會在每個輸出之后自動加入一個換行符(linux默認沒有print命令)
?
printf:printf是標準格式輸出命令,并不會自動加入換行符,如果需要換行,需要手工加入換行符。
0x05、sed
sed是一種幾乎包括在所有unix平臺(包括linux)的輕量級流編輯器。sed主要是用來將數據進行選取、替換、刪除、新增的命令。
?
vim也可以進行選取,刪除,替換等,但是vim只能對文件進行修改,但是不可以直接對命令的結果進行修改,需先把命令保存到文件中,再對文件進行修改。而sed可以從管道符接收數據進行修改
sed [選項]?‘[動作]’文件名
常見選項
-n一般sed命令會把所有數據都輸出到屏幕,加入此參數,則只會把經過sed命令處理的行輸出到屏幕
-e允許對輸入數據應用多條sed命令編輯
-i用sed的修改結果直接修改讀取數據的文件,而不是由屏幕輸出
?
動作:
a\:追加,在當前行后添加一行或多行。添加多行時,除最后一行外,每行末尾需要用“\”代表數據未完結。
c\:行要用\”代表數據為完結。
替換,用c后面的字符串替換原來數據行,替換多行時,除最后一行外,每行末尾需i\:插入,在當前行前插入一行或多行,插入多行時,除最后一行外,每行末尾需要用\”代表數據為完結。
d:刪除,刪除指定的行。
p:輸出、打印指定的行。
s:字串替換,用一個字符串替換另外一個字符串。格式為“行范圍s/舊字串/新字串/g”(和vim中的替換格式類似)。
?
?
| 1 2 | sed?-n?"1p"?/etc/passwd?,查看etc/passwd中的第一行,如果不加-n參數,顯示這條操作外,還會顯示文件的全部內容,加-n 只會顯示處理的行 |
| 1 | sed?"2,36d"?/etc/passwd?,刪除第二行到第四行的數據,但不修改文件本身,只有加了-i參數才會修改文件本身 |
動作a和i都是添加,a是追加在行尾,i是插入在行前,但不都會修改文件本身,只會先顯示上做修改,不加-n?除了虎顯示修改的數據,還會顯示文本的所有數據。
動作c和動作s都是進行替換,c進行的是行的替換,s進行的是字符串的替換,字符替換的格式是sed?“s/舊字符串/新字符串/g”文件名,在s前指定行只需改指定的行,不指定會修改所有的。
0x06、sort 排序命令
sort?【選項】 文件名
選項
?-f忽略大小寫
?-n以數值型進行排序,默認使用字符串排序
-r反向排序
-t指定分隔符,默認使用的是制表符tab鍵
-k n[,m]按照指定的字段范圍排序,從第n字段開始,m字段結束,不加m默認到行尾
| 1 | sort?-t?":"?-k?3,3?/etc/passwd,仔細看,沒把uid當作字符串對待,而當數值型對待,需要加-n參數 |
本文轉自 wt7315 51CTO博客,原文鏈接:http://blog.51cto.com/wt7315/1860063
總結
以上是生活随笔為你收集整理的shell字符串截取总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对操作系统的五点感受--接口/进程/内存
- 下一篇: 安装LNMP环境