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/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 "……"