本篇内容介绍了“bash的基础特性”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
一、bash特性
1. 命令历史: history
.bash_history:用户登出时保存命令历史的文件(用户家目录下的隐藏文件)
history #:显示最近的#条命令;
调用命令历史列表中的命令
!#:再一次执行历史列表中的第#条命令;
!!:再一次执行上一条命令;
!STRING:再一次执行命令历史列表中最近一个以STRING开头的命令;
调用上一条命令的最后一个参数:
快捷键:ESC, . (ESC松开后再按.)
快捷键:Alt+. (按住Alt再按.)
字符串:!$ (直接输入!$)
[root@localhost local]# cat /tmp/script/idsum1.sh
......
[root@localhost local]# vi !$
vi /tmp/script/idsum1.sh
2.补全: 命令补全: 能唯一标识,则直接Tab补全,不能的话,再按一次Tab给出列表; 外部命令根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名 路径补全: 唯一标识Tab补全,不能的话,再按一次Tab给出列表; 3.命令行展开 ~:自动展开为用户的家目录,或指定的用户的家目录; {}:可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;
[root@localhost tmp]# ls x_{y,z}
x_y:
afile1 afile2
x_z:
afile3 afile4
4.命令的状态执行结果
成功: 返回0;
失败: 1~255;
命令执行完成后,执行状态保存在bash的特殊变量$?中;
[root@localhost x_z]# useradd yc
[root@localhost x_z]# echo $?
[root@localhost x_z]# useradd yc
useradd: user 'yc' already exists
[root@localhost x_z]# echo $?
9
命令正常执行时,有的还会有命令返回值,根据命令及其功能不同,结果各不相同。
引用命令的执行结果:$(COMMAND)或~(COMMAND)
5.引用
强引用:单引号,其中任何内容直接显示,不做替换。
弱引用:双引号,其中变量做变量替换,将出现变量的地方替换成变量的值。
命令引用:反单引号,就是引用命令执行结果,$(COMMAND)或~(COMMAND)。
[root@localhost x_z]# name="YC"
[root@localhost x_z]# echo '$name'
$name
[root@localhost x_z]# echo "$name"
YC
[root@localhost x_z]# mkdir dir_`date +%h-%M-%S`
[root@localhost x_z]# ls
afiel3 afile4 dir_Jul-48-03
6.快捷键
ctrl+a : 跳至命令行首;
ctrl+c : 跳至命令行尾;
ctrl+u : 删除从行首到光标;
ctrl+k : 删除从光标到行尾;
ctrl+l : clear;
7. 文件通配符 globbing
通配符实际上是一种shell实现的路径扩展功能,当shell在“参数”中遇到通配符后,
会将其当做路径或文件名在磁盘上搜寻可能的匹配。
* : 匹配任意长度任意字符;
? : 匹配任意单个字符,如??pa,p?a?;
[]: 匹配指定范围内的任意单个字符;
有几种特殊格式: [a-z];[A-Z];[0-9];[a-z0-9]
[[:upper:]] : 所有大写字母
[[:lower:]] : 所有小写字母
[[:digit:]] : 所有数字
[[:alpha:]] : 所有字母
[[:alnum:]] : 所有字母和数字
[[:space:]] : 空格字符
[[:punct:]] : 所有标点符号
不记得没关系,man grep里面有:Their names are self explanatory, and
they are [:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:],
[:lower:], [:print:], [:punct:], [:space:], [:upper:], and [:xdigit:].
For example, [[:alnum:]] means the character class of numbers and letters
in the current locale. In the C locale and ASCII character set encoding,
this is the same as [0-9A-Za-z]
^[]: 匹配指定范围外的任意单个字符;
[^[:upper:]]
[^a-z]
示例:
[root@localhost x_z]# ls *[Ff]ile* ---含File或者file的文件名
afile4 myfile MyFile myfile_002
[root@localhost x_z]# find /tmp/x_z/ -name "*[^[:alpha:]]*" ---含非字母的文件名
/tmp/x_z/
/tmp/x_z/afile4
/tmp/x_z/afiel3
/tmp/x_z/dir_Jul-48-03
/tmp/x_z/1.txt
/tmp/x_z/myfile_002
[root@localhost x_z]# find /tmp/x_z/ -name "*[^a-z]*" ---含非小写字母的文件名
/tmp/x_z/
/tmp/x_z/afile4
/tmp/x_z/afiel3
/tmp/x_z/dir_Jul-48-03
/tmp/x_z/1.txt
/tmp/x_z/myfile_002
/tmp/x_z/MyFile
二、正则表达式
由一类特殊字符集文本字符所编写的模式,其中有些字符不表示其字面意义(要表示要用转义字符/),而是用于表示控制或者统配的功能。
表达式组成:原义文本字符+元字符
元字符:指那些在正则表达式中具有特殊意义的专用字符,它使正则表达式具有处理能力。
grep:Global search Regular expression and print out the line
文本搜索工具,根据用户指定的模式(过滤条件)对目标文件逐行进行匹配检查,打印匹配的行;
正则表达式引擎:元字符及规则因引擎的不同略有不同。
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
OPIONTS:
-i : 不区分大小写(ignore case);
-o : 仅显示匹配到的字符;
-v : 显示不能匹配到的行;
-q : 不输出任何信息(当只需要执行结果状态时使用)
-E : 支持扩展正则表达式
-A #: after 匹配行的后#行
-B #: before匹配行的前#行
-C #: context 匹配行的前后#行
基本正则表达式元字符:
字符匹配
. : 匹配任意单个字符;
[]: 匹配指定范围内的任意单个字符;
有几种特殊格式: [a-z];[A-Z];[0-9];[a-z0-9]
[[:upper:]] : 所有大写字母
[[:lower:]] : 所有小写字母
[[:digit:]] : 所有数字
[[:alpha:]] : 所有字母
[[:alnum:]] : 所有字母和数字
[[:space:]] : 空格字符
[[:punct:]] : 所有标点符号
man grep里面:Their names are self explanatory, and
they are [:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:],
[:lower:], [:print:], [:punct:], [:space:], [:upper:], and [:xdigit:].
For example, [[:alnum:]] means the character class of numbers and letters
in the current locale. In the C locale and ASCII character set encoding,
this is the same as [0-9A-Za-z]
^[]: 匹配指定范围外的任意单个字符;
[^[:upper:]]
次数匹配: 指定出现的次数的字符后面,限制前面字符出现的次数,实行贪婪模式
贪婪模式:在整个表达式匹配成功的前提下,尽可能多的匹配;
* : 匹配前面字符的任意次,0次,1次或者多次
.* : 匹配前面任意长度的任意字符;
\? : 匹配前面字符0次或者1次,即可有可无;
\+ : 匹配前面字符1次或者多次,即必存在;
\{m\} : 匹配前面字符指定m次;
\{m,n\} : 匹配前面字符至少m次,至多n次;
\{0,n\} : 匹配前面字符至多n次;
\{m,\} : 匹配前面字符至少m次;
位置锚定:
^ : 行首锚定
$ : 行尾锚定;
^PATTEERN$ : 用PATTERN来匹配整行;
^$ : 空白行;
^[[:space:]]*$ : 空行或者包含空白字符的行;
单词锚定:
\<或者\b : 词首锚定,放在词的前面;
\>或者\b : 词尾锚定,放在词的后面;
\<PATTEERN\> : 匹配完整单词PATTERN;
分组及引用
\(\) :将一个或者多个字符捆绑在一起,作为一个整体处理;用括号括起来,表示括号时要用转义字符;
注意:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部变量中,这些变量为:
\1: 模式从左边起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\2: 模式从左边起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\3:
后项引用: 引用前面的分组括号中的模式所匹配的字符;
练习:
2. 显示/etc/passwd文件中不以/bin/bash结尾的行
[root@localhost x_z]# grep -v “/bin/bash$” /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
......
3. 找出/etc/passwd中包含二位数字或者三位数字的行
[root@localhost x_z]# grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
......
4. 显示/porc/meminfo文件中大写或者小写S开头的行
[root@localhost x_z]# grep "^[Ss]\+*" /proc/meminfo ----错误示范,这个*可以是0次,没有s也行;
MemTotal: 3868768 kB
MemFree: 2927360 kB
....
[root@localhost x_z]# grep "^[Ss]\+" /proc/meminfo
SwapCached: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Shmem: 9368 kB
Slab: 149628 kB
SReclaimable: 85044 kB
SUnreclaim: 64584 kB
[root@localhost x_z]# grep -i "^[s]\+" /proc/meminfo
SwapCached: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Shmem: 9368 kB
Slab: 149628 kB
SReclaimable: 85044 kB
SUnreclaim: 64584 kB
[root@localhost x_z]# grep -E "^(s|S)+" /proc/meminfo
SwapCached: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Shmem: 9368 kB
Slab: 149788 kB
SReclaimable: 85028 kB
SUnreclaim: 64760 kB
egrep 支持扩展的正则表达式,实现grep文本过滤功能;grep -E
-i;-o;-v;-q;-G(基本正则表达式)
支持扩展正则表达式元字符:
字符匹配
. : 匹配任意单个字符;
[]: 匹配指定范围内的任意单个字符;
^[]: 匹配指定范围外的任意单个字符;
次数匹配: 指定出现的次数的字符后面,限制前面字符出现的次数,实行贪婪模式
贪婪模式:在整个表达式匹配成功的前提下,尽可能多的匹配;
* : 匹配前面字符的任意次,0次,1次或者多次
.* : 匹配前面任意长度的任意字符;
? : 匹配前面字符0次或者1次,即可有可无;
+ : 匹配前面字符1次或者多次,即必存在;
{m} : 匹配前面字符指定m次;
{m,n} : 匹配前面字符至少m次,至多n次;
{0,n} : 匹配前面字符至多n次;
{m,} : 匹配前面字符至少m次;
位置锚定:
^ : 行首锚定
$ : 行尾锚定;
^PATTEERN$ : 用PATTERN来匹配整行;
^$ : 空白行;
^[[:space:]]*$ : 空行或者包含空白字符的行;
单词锚定:
\<或者\b : 词首锚定,放在词的前面;
\>或者\b : 词尾锚定,放在词的后面;
\<PATTEERN\> : 匹配完整单词PATTERN;
分组及引用
( ):将一个或者多个字符捆绑在一起,作为一个整体处理;用括号括起来,表示括号时要用转义字符;
注意:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部变量中,这些变量为:
\1: 模式从左边起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\2: 模式从左边起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\3:
后项引用: 引用前面的分组括号中的模式所匹配的字符;
或 a|b
如 C|cat 表示C或者cat;
(C|c)at 表示Cat或者cat;
练习:
5. 使用echo输出一个绝对路径,使用egrep取出路径名,类似执行dirname /etc/passwd的结果。
[root@localhost pp]# pwd
/tmp/x_z/pp
[root@localhost pp]# ls
YC.sh
[root@localhost pp]# dirname /tmp/x_z/pp/YC.sh
/tmp/x_z/pp
[root@localhost pp]# echo /tmp/x_z/pp/YC.sh | grep -E ".*/\<" ----显示匹配的行全部
/tmp/x_z/pp/YC.sh
[root@localhost pp]# echo /tmp/x_z/pp/YC.sh | grep -E -o ".*/\<"
/tmp/x_z/pp/
6. 找出ifconfig的IP地址,要求结果中只显示IP地址。
[root@localhost pp]# ifconfig | grep -Eo "(\<([0-9]|[0-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>.){3}
\<([0-9]|[0-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
192.167.1.23
255.255.255.0
192.167.1.255
127.0.0.1
255.0.0.0
fgrep: 不支持正则表达式元字符,任何符号都是字符;
当无需要用到元字符去编写模式时,使用fgrep会更好。
“bash的基础特性”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:http://blog.itpub.net/69934036/viewspace-2650494/