shell中的引號
* $
反斜線
反斜線跟在某個字符前面,示意爲轉義,顯示該字符原有含義
* 代表任意的 \*
單引號
單引號可以將它中間的所有任意字符還原爲字面意思,實現屏蔽shell元字符的功能
' **' '** ' #單引號再次成對出現
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# echo '$HOME'
$HOME
[root@localhost ~]# echo "$HOME"
/root
[root@localhost ~]# echo "\$HOME"
$HOME
[root@localhost ~]# echo 'hello'
hello
[root@localhost ~]# echo 'hello\'
hello\
雙引號
類似單引號,但是跟單引號略微有不同
他不會屏蔽 ` \ $ 這三個元字符含義
若想屏蔽元字符含義需加轉義字符
[root@localhost ~]# echo "Hello world"
Hello world
[root@localhost ~]# echo "My name's BJTLXY."
My name's BJTLXY.
[root@localhost ~]# echo "$HOME"
/root
[root@localhost ~]# echo "\$HOME"
$HOME
反引號
反引號主要進行命令替換
#該功能可以使用$()來替換
[root@localhost ~]# echo "Today is `date +%D`"
Today is 11/14/18
[root@localhost ~]# echo "Today is $(date +%D)"
Today is 11/14/18
正則表達式(grep/egrep)
則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯《百度百科》
常用正則表達式及含義
- 正則表達式手冊
- 30分鐘入門教程
-
as 匹配字母as
. 匹配任意字符- 匹配前一個字符出現0次或者多次
- 匹配前一個字符出現1次或者多次
? 匹配前一個表達式匹配0次或者一次,取消貪婪模式
.* 貪婪模式 匹配任意多個任意字符
[] 匹配集合中任意單個字符,括號中爲集合 [adc]
[a-z] 匹配集合中的範圍
^ 匹配字符串的開頭
$ 匹配字符串額結尾
[^……] 匹配否定,類似取反
| 匹配豎線倆遍的任何一個
\ 轉義字符,匹配轉義後的字符串
{n,m} 匹配前一個字符重複出現n到m次
{n,} 匹配前一個字符重複出現至少n次
() 將(與)之間的內容存儲在"保留空間,最大存儲9個"
\n 通過\1\9調用保留空間中的內容
#查找包含oot或ost的行
grep o[os]t /tmp/passwd#查找包含數據0-9的行
grep [0-9] /tmp/passwd
grep [f-q] /tmp/passwdgrep ^root /tmp/passwd
grep bash$ /tmp/passwd
#查找sbin/後面不跟n的行
grep sbin/[^n] /tmp/passwd#查找數字0出現一次,倆次的行
grep '0{1,2}' /tmp/passwd#查找包含倆個root的行,1表示保留空間()的第一個值,即:root
grep "(root).*\1" /tmp/passwd#查找包含以root:開頭的行,並以:root結尾的行
grep "(root)(:).*\2\1" /tmp/passwd
#匹配空白行
grep ^$ /tmp/passwd#匹配非空白行
grep -v ^$ /tmp/passwd正則匹配出的是其中的某一行,但是想要打印匹配行的前幾行或者後幾行
-A 打印匹配結果之後的行
-B 打印匹配結果之前的行
-C 分別打印出匹配結果之前以及之後的n行seq 類似python中range
[root@localhost ~]# seq 10 | grep 5 -C 2
3
4
5
6
7
拓展正則表達式(Extended Regular Expression)
{n,m} 等同於基本正則表達式\{n,m\}
+ 匹配前一個字符出現一次或者多次
? 匹配前一個字符出現0次或者一次
| 匹配前/後字串 邏輯或
() 匹配正則集合
#查找數據0出現1下或者2次的行
[root@localhost ~]# grep '0{1,2}' /etc/passwd
[root@localhost ~]# egrep '0{1,2}' /etc/passwd
#查找至少出現一個0的行
[root@localhost ~]# egrep '0+' /tmp/passwd
#查找包含root或者yuxiang的行
[root@localhost ~]# egrep '(root|yuxiang)' /tmp/passwd
## cut按列切分文件
cut主要用於按列切分文件,針對csv文件或者說空格分割的文件(標準日誌文件)
1.-f 指定要提取的字段
cut -f FILED_LIST filename
FILED_LIST 需要顯示的列,列號之間用逗號分割
#示例文件
[root@localhost ~]# cat student_data.txt
No Name Mark Percent
1 Sarath 45 90
2 Alex 49 98
3 Anu 45 90
#獲取文件第2,3列的值
[root@localhost ~]# cut -f 2,3 student_data.txt
Name Mark
Sarath 45
Alex 49
Anu 45
[root@localhost ~]#
2.cut命令可以從stdin讀取輸入
製表符默認爲分隔符,對於沒有使用分隔符的行,該命令會講文件原樣打印出來。cut的選項-s可以禁止原樣打印
[root@localhost ~]# cut -f2 -s test.txt
3.提取多列內容,有分隔符組成字段編號用逗號隔開
[root@localhost ~]# cut -f2,3 student_data.txt
4.可以使用--complement顯示出沒有被-f指定的字段(反選)
[root@localhost ~]# cut -f1 --complement student_data.txt
Name Mark Percent
Sarath 45 90
Alex 49 98
Anu 45 90
[root@localhost ~]#
5.-d指定分隔符
head -5 /tmp/passwd | cut -d";" -f 1
指定字段的字節範圍
N- 從第N個字節,字符或者字段開始到行尾
N-M 從第N個字節,字符或者字段開始到第M個字節(包括M在內)
-M 從頭到第M個字節,字符或者字段
-b 代表字節
-c 代表字符
-f 代表字段
vim a.txt
abcdefghiklmnopqrstuvwxyz
abcdefghiklmnopqrstuvwxyz
abcdefghiklmnopqrstuvwxyz
abcdefghiklmnopqrstuvwxyz
abcdefghiklmnopqrstuvwxyz
#打印2-5個字符
[root@localhost ~]# cut -c2-5 a.txt
#打印前倆個字符
[root@localhost ~]# cut -c -2 a.txt
#顯示多個區間內容,可以用--output-delimiter設置分隔符
[root@localhost ~]# cut a.txt -c1-3,6-9 --output-delimiter "……"