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)
则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑《百度百科》
常用正则表达式及含义
-
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/passwd
grep ^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 "……"