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

 

环境变量:

envexportset

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 || cmd2cmd1执行错误且执行完毕才会执行cmd2cmd1正确执行且完成后不会执行cmd2

 

管线命令:

管线命令 | 仅能处理经由前面一个指令传来的正确信息,也就是 standard output 的信息,对于 stdandard error 并没有直接处理的能力

在每个管线后面接的第一个数据必定是指令而且这个指令必须要能够接受 standard input 的数据才行,这样的指令才可以是为管线命令,例如lessmoreheadtail

撷取命令: cut, grep

cut是将一行讯息当中,取出某部分我们想要的

cut -d '分隔字符' -f fields  用于有特定分隔字符

cut -c 字符区间  以字符 (characters) 的单位取出固定字符区间

grep是分析一行信息若符合的,将其拿出来

grep [-acinv]  '搜寻字符串' filename 

-a:将二进制文件以txt文件格式检索

-c: 计算搜索到字符串的次数

-i: 不区分字符串的大小写

-n: 输出行号

-v: 反向筛选,除字符串的全部内容显示出来

 

排序命令:sortwcuniq

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 :在文件中的testtxst中的行

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-zoo的字符串开头的行

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 gdgood

() :意义:找出群组字符串

egrep -n 'g(la|oo)d' filename 重复部分的字符串

()+

意义:多个重复群组的判别

echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C' 中间有一个以上的 "xyz" 字符串

 

 

 

Linux账号管理:

每一个文件都拥有UIDPID,通过系统会依据/etc/passwd/etc/group的内容,找到UID/GID对应的账号与组名再显示出来

 

使用者身份切换:

su [-lm] [-c 指令] [username]

-l :与 - 类似,但后面需要加欲切换的使用者账号!也是 login-shell 的方式。

-m -m -p 是一样的,表示『使用目前的环境设定,而不读取新使用者的配置文件』

-c :仅进行一次指令,所以 -c 面加上指令

login-shellnon-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指令。

 

posted @ 2019-07-25 15:05  pw_fan  阅读(381)  评论(0编辑  收藏  举报