bash及正规表示法
BASH:
BASH Shell功能:
命令编修能力:指令历史存储在~/.bash_history 文件中。
命令与文件补全功能:在指令正确的情况下快速补全指令。
命令别名设定功能:利用alias设置命令的别名。
程序化脚本:shell scripts将连续指令写成文件执行。
通配符:利用通配符,这些都能够加快使用者的操作,帮助用户下达指令和操作。
变量的取用与设定:
echo:取出变量内容 echo ${PATH}
变量设定规则:变量与变量内容以=连接
1)=两边不能有空格
2)变量开头不能用数字
3)有空格符以双引号和单引号连接,双引号连接可以保存特殊字符原本的特性,单引号连接的一般为一般字符(纯文本)文件,将特殊字符作为一般字符使用
4)使用“\”跳脱字符将(空格,$,[enter]等)变成一般字符。eg.:username=hello\ world
5)使用` `反引号或$()将指令执行后传达给变量。eg.:version=$(ls -l) version=`ls -l`
6)将变量扩增变量内容eg.: path=$(version):/usr/bin path=”$version”:/usr/bin
7)变量在其他子程序执行,将变量加入环境变量 export path
8)取消变量的方法为使用 unset
环境变量:
env、export、set
env:显示当前shell环境下所有的环境变量与变量内容
set:显示所有变量
export:将自定义变量加入到全局变量之中,不在另一个终端生效 export 变量名
当启动一个 shell,操作系统会分配一记忆区块给 shell 使用,此内存内之变量可让子程序取用 ;
若在父程序利用 export 功能,可以让自定义变量的内容写到上述的记忆区块当中(环境变量);
当加载另一个 shell 时 (亦即启动子程序,而离开原本的父程序了),子 shell 可以将父 shell 的环境变量所在的记忆区块导入自己的环境变量区块当中。
locale查询Linux内支持的语系存储在/usr/lib/locale/
变量键盘读取:read -p “提示语” -s 秒数 变量名
declare 和 typeset 是一样的功能,宣告变量的类型
declare -i 变量名:变量为整型变量
declare -a 变量名:变量定义为整形数组
declare -x:与export功能相同,加入环境变量
declare -r:设定为readonly类型,不可以修改,也不可以unset
declare -p:单独列出变量的类型
declare +x:变成非环境变量的一般变量
变量内容的删除、取代与替换
从前面开始删除变量内容:
${变量#关键词} 若变量内容从头开始的数据符合关键词,则将符合的最短数据删除
${变量##关键词} 若变量内容从头开始的数据符合关键词,则将符合的最长数据删除
eg.: echo ${path#/*local/bin:}
从后面向前删除变量内容:
${变量%关键词} 若变量内容从尾向前的数据符合关键词,则将符合的最短数据删除
${变量%%关键词} 若变量内容从尾向前的数据符合关键词,则将符合的最长数据删除
变量内容取代:
${变量/旧字符串/新字符串} 若变量内容符合旧字符串则第一个旧字符串会被新字符串取代
${变量//旧字符串/新字符串} 若变量内容符合旧字符串则全部的旧字符串会被新字符串取代
命令别名设置:
eg.:alias lm='ls -al | more'
删除别名:
eg.:unalias lm
通配符与特殊符号:
* 代表 0 个到无穷多个任意字符
? 代表一定有一个任意字符
[ ] 同样代表一定有一个在括号内的字符(非任意字符)。例如 [abcd] 代表一定有一字个符, 可能是 a, b, c, d 这四个任何一个
[ - ] 若有减号在中括号内时,代表在编码顺序内的所有字符。例如 [0-9] 代表 0 到 9 之间的所有数字, 因为数字的语系编码是连续的
[^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示反向选择,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。
| 管线 (pipe):分隔两个管线命令的界定
; 连续指令下达分隔符:连续性命令的界定
>, >> 数据流重导向:输出导向,分别是取代与累加
<, << 数据流重导向:输入导向
数据流重导向
>:以覆盖的方法将『正确的数据』输出到指定的文件或装置上;
>>:以累加的方法将『正确的数据』输出到指定的文件或装置上;
将指令显示的正确与错误信息都写入到一个文件中:eg.:find /home -name .bashrc > list 2>&1
输入重导向左右:
屏幕输出的信息很重要,而且我们需要将他存下来的时候;
背景执行中的程序,不希望他干扰屏幕正常的输出结果时;
一些系统的例行命令 (例如写在 /etc/crontab 中的文件) 的执行结果,希望他可以存下来时;
一些执行命令的可能已知错误讯息时,想以『 2> /dev/null 』将他丢掉时;
错误讯息与正确讯息需要分别输出时。
<与<<:将原本需要由键盘输入的数据,改由文件内容来取代
<: cat > cat file < ~/.bashrc 将.bashrc的内容由cat导入到file中
<<: cat > cat file << "eof",输入的信息以eof为结束标志,不会写入到file文件中
命令执行的判断依据:
;:不考虑指令相关性,将命令分割开来连续执行
&&:cmd1 && cmd2 只有cmd1正确执行且执行完毕才会执行cmd2
||:cmd1 || cmd2当 cmd1执行错误且执行完毕才会执行cmd2,cmd1正确执行且完成后不会执行cmd2
管线命令:
管线命令 | 仅能处理经由前面一个指令传来的正确信息,也就是 standard output 的信息,对于 stdandard error 并没有直接处理的能力
在每个管线后面接的第一个数据必定是指令,而且这个指令必须要能够接受 standard input 的数据才行,这样的指令才可以是为管线命令,例如less,more,head,tail
撷取命令: cut, grep
cut是将一行讯息当中,取出某部分我们想要的
cut -d '分隔字符' -f fields 用于有特定分隔字符
cut -c 字符区间 以字符 (characters) 的单位取出固定字符区间
grep是分析一行信息若符合的,将其拿出来
grep [-acinv] '搜寻字符串' filename
-a:将二进制文件以txt文件格式检索
-c: 计算搜索到字符串的次数
-i: 不区分字符串的大小写
-n: 输出行号
-v: 反向筛选,除字符串的全部内容显示出来
排序命令:sort,wc,uniq
sort [-fbnrtuk] [file or stdin]
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空格符部分;
-n :使用纯数字进行排序(默认是以文字型态来排序的);
-r :反向排序;
-u :就是 uniq ,相同的数据中,仅出现一行代表;
-t :分隔符,预设是用 tab键来分隔;
-k :以那个区间 (field) 来进行排序的意思
uniq -ic
-i :忽略大小写字符的不同;
-c :进行计数
wc [-lwm]:计算文件里面到底有多少相关字、行、字符数
-l :仅列出行;
-w :仅列出多少字(英文单字);
-m :多少字符;
双向重导向:tee
tee [-a] file:以累加的方式将数据加入file中
eg.:last | tee last.list | cut -d " " -f1 last的数据全部存储在last.list中,显示在终端上是cut完的结果
字符转换命令: tr, col, join, paste, expand
tr 可以用来删除一段讯息当中的文字,或者是进行文字讯息的替换
tr [-ds] SET1 ...
-d :删除讯息当中的 SET1 这个字符串;
-s :取代掉重复的字符
col [-xb]
-x :将 tab 键转换成对等的空格键
join [-ti12] file1 file2 两个文件当中,有 "相同数据" 的那一行,才将其加在一起
-t :join 默认以空格符分隔数据,并且比对『第一个字段』的数据, 如果两个文件相同,则将两笔数据联成一行,且第一个字段放在第一个
-i :忽略大小写的差异;
-1 :这个是数字的 1 ,代表『第一个文件要用那个字段来分析』的意思;
-2 :代表『第二个文件要用那个字段来分析』的意思。
paste [-d] file1 file2 将两行贴在一起,且中间以 [tab] 键隔开
-d :后面可以接分隔字符。预设是以 [tab] 来分隔的!
- :如果 file 部分写成 - ,表示来自 standard input 的资料的意思。
expand [-t] file :将tab键转成空格键
分区命令:split将一个大文件,依据文件大小或行数来分区,就可以将大文件分区成为小文件
split [-bl] file PREFIX
-b :后面可接欲分区成的文件大小,可加单位,例如 b, k, m 等;
-l :以行数来进行分区。
PREFIX :代表前导符的意思,可作为分区文件的前导文字。
将分开的文件再进行数据重导向就可以恢复原来的文件
正规表示法
正规表示法就是处理字符串的方法,他是以行为单位来进行字符串的处理行为, 正规表示法透过一些特殊符号的辅助,可以让使用者轻易的达到『搜寻/删除/取代』某特定字符串的处理程序
基础正规表示法:
[:alnum:] 代表英文大小写字符及数字,即 0-9, A-Z, a-z
[:alpha:] 代表任何英文大小写字符,即 A-Z, a-z
[:digit:] 代表数字而已,即 0-9
[:lower:] 代表小写字符,即 a-z
[:upper:] 代表大写字符,即 A-Z
利用中括号 [] 来搜寻集合字符
grep -n ‘t[ex]st’ filename :在文件中的test和txst中的行
grep -n ‘oo’ filename: 文件中带oo的字符串的行
grep -n ‘[^g]oo’ filename:文件中oo前没有g字符串的行
grep -n ‘[[:digit:]]’ regular_express.txt: 文件中含有数字字符串的行
行首和行尾的表示:
grep -n ‘^[a-z]oo’ filename:行首以a-z带oo的字符串开头的行
grep -n ‘[\.]$’ filename:行尾以.为结尾的行
grep -v ‘^$’ filename|grep -v ‘^#’ 筛选不是空白行且不是以#开头的提示语句
任意一个字符与重复字符
. (小数点):代表一定有一个任意字符的意思;
* (星星号):代表重复前一个字符, 0 到无穷多次的意思,为组合形态
限定连续 RE 字符范围 {}
grep -n 'o\{2,5\}' filename:通过跳脱字符来界定出现重复字符的次数
sed工具:
sed [-nefr] [function]
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自stdin的数据一般都会被列出到屏幕上,但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来
-e :直接在指令列模式上进行 sed 的动作编辑;-f :直接将 sed 的动作写在一个文件内
-f filename 则可以执行 filename 内的 sed 动作
-r :sed 的动作支持的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是由屏幕输出
function:
a :新增, a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!
延伸正规表示法:
+ :意义:重复一个或一个以上的前一个 RE 字符
egrep -n 'go+d' filename o+ 代表一个以上的 o
? :意义:零个或一个的前一个 RE 字符
egrep -n 'go?d' filename 那个 o? 代表空的或 1 个 o
| :意义:用或( or )的方式找出数个字符串
egrep -n 'gd|good' filename 找gd和good
() :意义:找出群组字符串
egrep -n 'g(la|oo)d' filename 重复部分的字符串
()+
意义:多个重复群组的判别
echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C' 中间有一个以上的 "xyz" 字符串
Linux账号管理:
每一个文件都拥有UID与PID,通过系统会依据/etc/passwd与/etc/group的内容,找到UID/GID对应的账号与组名再显示出来
使用者身份切换:
su [-lm] [-c 指令] [username]
-l :与 - 类似,但后面需要加欲切换的使用者账号!也是 login-shell 的方式。
-m :-m 与 -p 是一样的,表示『使用目前的环境设定,而不读取新使用者的配置文件』
-c :仅进行一次指令,所以 -c 后面加上指令
login-shell与non-loginshell的变量读取方法。
使用su切换root账号时,读取的变量设定方式为non-login shell的方式,这种方式很多原本的变量不会被改变,很多数据无法直接使用。
su -u读取的变量设定方式为login-shell的方式,转换root时最好使用su -u。
su - -c "head -n 3 /etc/shadow" :使用root权限执行后返回旧的用户身份。
sudo执行:能否使用 sudo 必须要看 /etc/sudoers 的设定值, 而可使用 sudo 者是透过输入用户自己的密码来执行后续的指令串,通过visudo编辑sudoers文件,sudoers是有规范的,使用visudo修改完系统会检查文件语法,避免无法使用sudo指令。