当前位置: 首页 > news >正文

linux基础学习8

 
管理主机每天任务: 查询登录档、追踪流量、监控用户使用主机状态、主机各项硬设备状态、 主机软件更新查询、其他使用者要求;
因此shell script 就必须要学啊,虽然可以说绝大部分shell能做的事情python或者perl都能做,但是系统很多服务都是用shell script写的啊,所以shell script还是必须要学;
 
编写shell script注意事项:
1. 指令的执行是从上而下、从左而右的分析与执行;
2. 指令、选项与参数间的多个空白都会被忽略掉;
3. 空白行也将被忽略掉,并且 [tab] 按键所推开的空白同样视为空格键;
4. 如果读取到一个 Enter 符号 (CR) ,就尝试开始执行该行 (或该串) 命令;
5. 至于如果一行的内容太多,则可以使用『\[Enter] 』来延伸至下一行;
6. 『# 』可做为批注任何加在 # 后面的资料将全部被规为批注文字而忽略
 
养成良好的 script 撰写习惯,在每个 script 的文件头处记录好:
 script 的功能;
 script 的版本信息;
 script 的作者与联系方式;
 script 的版权宣告方式;
 script 的 History (历史纪录);
 script 内较特殊的指令,使用『绝对路径』的方式来下达;
 script 运作时需要的环境变量预先宣告与设定。
 
shell中数值计算:
var=$((运算内容))
注意是两个括号;
 
zhenxiang@ubuntu:~$ var=$((3+4))
zhenxiang@ubuntu:~$ echo $var
7

 

直接下达指令或者是用bash或sh来下达指令时, 该 script 都会使用一个新的 bash 环境来执行脚本内的指令!也就是说,使用者种执行方式时, 其实 script 是在子程序的 bash 内执行的;我们知道子进程可以继承父进程的环境变量等,而父进程却没有办法得到子进程的变量;来看一个例子:
[root@www scripts]# echo $firstname $lastname
<==确认了,这两个发量并不存在喔!
[root@www scripts]# sh sh02.sh     <==传两个变量到脚本中
Please input your first name: VB    <==这个名字是自己输
Please input your last name: Tsai
Your full name is: VB Tsai              <==在 script 运作中,这两个发数有生效
[root@www scripts]# echo $firstname $lastname
<==事实上,这两个变量在父程序的 bash 中还是不存在的
但是用source 则脚本就会在父进程中执行噢
source
利用 source 来执行脚本:在父进程中执行;
 
shell特殊变量:
变量含义
$0当前脚本的文件名
$n传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#传递给脚本或函数的参数个数。
$*传递给脚本或函数的所有参数。
$@传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$?上个命令的退出状态,或函数的返回值。
$$当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
 
 
#!/bin/bash
echo "File Name: $0"
echo "First Parameter : $1"
echo "First Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "PID: $$"
echo "Total Number of Parameters : $#"

 

 
运行结果:
 
$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
PID:2760
Total Number of Parameters : 2

 

$* 和 $@ 的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。
但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
 
 
test 指令的测试功能 
[root@www ~]# test -e /dmtsai && echo "exist" || echo "Not exist"
Not exist <==结果显示不存在啊!
文件存在与否测试
-e 该『档名』是否存在?
-f 该『档名』是否存在且为档案(file)?
-d 该『文件名』是否存在且为目录(directory)?
当然除了常用的测试文件档案存在与否,test还可以测试档案的权限,两档案间比较,两整数间判定,字符串数据的判定,多重条件判定,详细使用可以man test;
 
判断符号:[ ]
例子: $HOME 是否为空
[root@www ~]# [ -z "$HOME" ] ; echo $?
 1

 

注意:bash的语法中,中括号作为shell的判断式, 必须要注意中括号的两端需要有空格符来分隔;
假设我空格键使用『□』符号来表示,那么,在这些地方你都需要有空格键:
[ "$HOME" == "$MAIL" ]
[□"$HOME"□==□"$MAIL"□]
 
注意点:
在中括号 [] 内的每个组件都需要有空格键来分隔;
在中括号内的变数,最好都以双引号括号起来;
在中括号内的常数,最好都以单或双引号括号起来。
 
为什么要这么麻烦啊?直接举例来说,假如我设定了 name="VBird Tsai" ,然后这样判定:
[root@www ~]# name="VBird Tsai"
[root@www ~]# [ $name == "VBird" ]
bash: [: too many arguments
其实$name 应该代替 VBird Tsai,原判断式则变成 [VBird Tsai  == "VBird"] 当然会出错咯,所以变量加引号是很重要的,很好的习惯;
 
read
常用:

输入在终端显示

read -p "Input passwd:" -s Passwd
echo $Passwd
 

限时输入,否则退出

#延迟五秒,没有输入将自动退出
read -p "Input a number:" -t 5 Number
 

读取限定字符

#从输入中取5个字符
read -p "Input a word:" -n 5 Word
 
等待输出m退出
#输入,直到输入m ,将自动退出
read -d  m -p "Input some words end with q:" word
 
-p 是终端提示字符显示;
当然如果有两个限制如:1.当输出m时退出   2.当输入5个字符之后退出 两者满足一个就退出
 
shift:造成参数变量号码偏移
[root@www scripts]# vi sh08.sh
#!/bin/bash
# Program:
# Program shows the effect of shift function.
# History:
# 2009/02/17 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo "Total parameter number is ==> $#"
echo "Your whole parameter is ==> '$@'"
shift # 进行第一次『一个变量的 shift 』
echo "Total parameter number is ==> $#"
echo "Your whole parameter is ==> '$@'"
shift 3 # 进行第二次『三个变量的 shift 』
echo "Total parameter number is ==> $#"
echo "Your whole parameter is ==> '$@'"
 
这玩意的执行成果如下:
[root@www scripts]# sh sh08.sh one two three four five six <==给予六个参数
Total parameter number is ==> 6 <==最原始的参数变量情况
Your whole parameter is ==> 'one two three four five six'
Total parameter number is ==> 5 <==第一次偏移,看底下发现第一个 one不见了
Your whole parameter is ==> 'two three four five six'
Total parameter number is ==> 2 <==第二次偏移掉三个,two three four不见了
Your whole parameter is ==> 'five six'
shift 后面可以接数字,代表拿掉最前面的几个参数的意思。 上面的执行结果中,第一次进行 shift 后他的显示情况是『 one two three four fivesix』,所以就剩下五个啦!第二次直接拿掉三个,就发成『 two three four five six 』
 
 
单重条件判断式:
if [ 条件判断断式 ]; then
          当条件判断式成立时,可以进行的指令工作内容;
else
          当条件判断式不成立时,可以进行的指令工作内容;
fi
 
多重条件判断式
if [ 条件判断式一 ]; then
          当条件判断式一成立时,可以进行的指令工作内容;
elif [ 条件判断式二 ]; then
          当条件判断式二成立时,可以进行的指令工作内容;
else
          当条件判断式一与二均不成立时,可以进行的指令工作内容;
fi
注意:if  elif  后面 均要加 ;then ,而 else并没有;
 
case语句
 
case    $变量名称  in           <==关键词为 case ,还有变量前有钱字号
"第一个变量内容")               <==每个变量内容建议用双引号括起来,关键词则为小括号 )
               程序段
               ;;                        <==每个类别结尾使用两个连续的分号来处理!
"第二个发量内容")
               程序段
               ;;
 *)                                    <==最后一个变量内容都会用 * 来代表所有其他值
                                               不包括第一个变量内容与第二个变量内容的其他程序执行段
               exit 1
               ;;
esac                                 <==以case 反写作为结束
 
 
function功能
注意点:function中特殊字符与shell中的特殊字符是相互独立的;
如例子:tt.sh
#!/bin/bash
function printit() {
    echo "this is printit \$1:$1"
}
printit 2
echo  "this is shell \$1:$1"
 
[root@www scripts]# ./tt.sh 4
this is printit $1:2
this is shell   $1:4  <==两者是不一样的噢;

 

 
循环:
当condition成立时才做do;
while [ condition ] <==中括号内的状态就是判断式
do                        <==do 是循环的开始!
          程序段落
done                    <==done 是循环的结束
 
当condition不成立时做do;
until [ condition ]
do
          程序段落
done
 
相对于 while, until 的循环方式是必须要符合某个条件的状态, for 这种语法,已经知道要进行几次循环
for var in con1 con2 con3 
do
          程序段
done
 
另一种写法的for循环;
for (( 初始值; 限制值; 执行步阶 ))
do
          程序段
done
 
shell script 的追踪与 debug
[root@www ~]# sh [-nvx] scripts.sh
选项与参数:
-n :不要执行 script,仅查询语法的问题;
-v :再执行 sccript 前,先将 scripts 的内容输出到屏幕上;
-x :将使用到的 script 内容显示到屏幕上,这是很有用的参数!

 

 
正则: Regular Expression
正则表达式与通配符是完全不一样的东西:
通配符:      代表的是bash操作接口的一个功能,
正则表达式:一种字符串处理的表达方式
 
 
特殊字符意义:
                 
尤其上表中的[:alnum:], [:alpha:], [:upper:], [:lower:], [:digit:] 这几个一定要知道代表什么意思,因为他要比 a-z 或 A-Z 的用途要确定的很好了!
 
grep 进阶
[root@www ~]# grep [-A] [-B] [--color=auto] '搜寻字符串' filename
选项与参数:
-A :后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来;
-B :后面可加数字,为 befer 的意思,除了列出该行外,前面的 n 行也列出来;
--color=auto 可将正确的那个攫取数据列出颜色
-n  : 加上行号来显示
-v  : 反向选择,即单行中没有该字符的;
-i   : 忽略大小写
 
行首与行尾字符 ^ $
[root@www ~]# grep -n '^the' regular_express.txt
12:the symbol '*' is represented as start.
#行首是the开头的,注意与通配符[^]区别很大噢,根本不是一个东西
#这个$自然就是攫取行尾咯
找出行尾是小数点” .“的
[root@www ~]# grep -n '\.$' regular_express.txt
#小数点有其他意思则需要 转意字符去,而$是放在行尾的啦;
找出空白行:
[root@www ~]# grep -n '^$' regular_express.txt
#只有行首和行尾当然就是空白行了
 
任意一个字符  .  与重复字符 *
 . (小数点):代表『一定有一个任意字符』的意思;
 * (星星号):代表『0个或无穷个前一个字符』的意思,为组合形态
#既然是组合形态当然是和前一个字符进行组合,就是说前一个字符不是单独存在的,是和这个*号来组合的,也就是说也可能没有前一个字符,也可能有无穷多个字符;
注:通配符*代表任意字符,与正则的小数点一样;
例子:找出g??d的字符串
[root@www ~]# grep  -n  'g..d'  regular_express.txt

 

例子:找出g开头与g结尾的字符串当中可有可无
是g*g吗?当然不是;g* 代表0个g或者一个以上的g 这个要重点理解一下;
[root@www ~]# grep -n 'g.*g' regular_express.txt
# .* 就代表零个或多个任意字符

 

再来一例:找出任意数字的一行
[root@www ~]# grep -n '[0-9][0-9]*' regular_express.txt
5:However, this dress is about $ 3183 dollars.
15:You are the best is mean you are the no. 1.
#虽然可以使用 grep -n '[0-9]' regular_express.txt 但,使用上面可以更好的理解#的作用
限定连续 RE 字符范围 {}
我想要找出两个到五个 o 的连续字符串,该如何作?这候就得要使用到限定范围的字符 {} 了。
因为 { 与 } 的符号在 shell 是有特殊意义的,因此, 我们必须要使用跳脱字符 \ 来让他失去特殊意义才行;
例子:找到两个O的字符串
[root@www ~]# grep -n 'o\{2\}' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
19:goooooogle yes!

 

例子:找到两到五个O的字符串
[root@www ~]# grep -n 'go\{2,5\}g' regular_express.txt
18:google is the best tools for search keyword.
例子:找到两个以上O的字符串
[root@www ~]# grep -n 'go\{2,\}g' regular_express.txt

 

sed 工具(主要对行来操作)
sed是一个管线命令,可以分析standard input;还可以将数据进行取代、删除、新增、攫取等;
[root@www ~]# sed [-nefr] [动作]
选项与参数:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN
        的数据一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过
        sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在指令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename内的sed动作;
-r :sed 的动作支持的是延伸型正则表示法的语法。(预设是基础正则表示法语法)
-i :直接修改读取的档案内容,而不是由屏输出
动作说明: n1,n2 function
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作
是需要在 10 到 20 行之间进行的,则『10,20[动作行为] 』
 
function 有底下这些咚咚:
a :新增, a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)
c :取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配
     正则表示法!例如 1,20s/old/new/g 就是啦!
 
范例一:将 /etc/passwd 的内容列出并且打印行号,同时,请将第 2~5 行删除!
[root@www ~]# nl /etc/passwd | sed '2,5d' 
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
如果是删除3行以后的呢? nl /etc/passwd | sed '3,$d' 
注意:$代表的是最后一行噢!
 
那么在第二行后第三行加上 “drink tea”
[root@www ~]# nl /etc/passwd | sed '2a drink tea'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
如果要在第二行前增加 则将 参数a改成参数i 

 

以行为单位的取代与显示:
范例四:我想将第 2-5 行的内容取代成为『 No 2-5 number』呢?
[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number'
1 root:x:0:0:root:/root:/bin/bash
No 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync
部分数据的搜寻并取代的功能
sed 's/要被取代的字符串/新的字符串/g'
当要删除时:sed 's/要删除的字符串//g' 即用空格替换将要取代的字符串,其实没有真的删除
 
那么要删除空白行呢?
sed '/^$/d'       其实就是选择空白字符串将其删除;
如果要删除以MANPATH_开头的字符串
sed '/MANPATH_.*$/d'    
总结:以部分数据为目的惊醒 搜寻取代与删除时,用 /正则选择的字符串 /  来表示;
 
 
直接修改档案内容:-i (危险动作)
范例七:利用 sed 直接在 regular_express.txt 最后一行加入『 # This is a test』
[root@www ~]# sed -i '$a # This is a test' regular_express.txt
# 由于$代表的是最后一行,而 a 的动作是新增,因此该档案最后新增啰

 

延伸正则表示法
举个例子:我们要去除空白行和行首为#的
grep -v ‘^$’regular.txt | grep -v '^#'
需要使用到两次管道命令来搜寻;那么如果使用延伸型只需要一次:
egrep -v  '^$|^#'   regular.txt

 

格式化打印: printf
[root@www ~]# printf '打印格式' 实际内容
选项与参数:
关于格式方面的几个特殊样式:
\a 警告声音输出
\b 退格键(backspace)
\f 清除屏幕 (form feed)
\n 输出新的一行
\r  亦即 Enter 按键
\t  水平的 [tab] 按键
\v  垂直的[tab] 按键
\xNN NN 为两位数的数字,可以转换数字成为字符。
关于 C 程序语言内,常见的变数格式
%ns 那个 n 是数字, s 代表 string ,亦卲多少个字符;
%ni 那个 n 是数字, i 代表 integer ,亦卲多少整数字数;
%N.nf 那个 n 与 N 都是数字, f 代表 floating (浮点),如果有小数字数,
假设我共要十个位数,但小数点有两位,即为%10.2f
 
awk:好用的数据处理工具
相较于sed常常用作整行的处理,awk则比较倾向于分成数个字段来处理;
通常的运作模式:
[root@www ~]# awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename
awk 截断每个字段,而$1代表第一个字段,$4代表第四个字段;字段的默认分隔符为空格或者tab键
例子:
[root@www ~]# last -n 5 <==仅列出前五行
root pts/1 192.168.1.100 Tue Feb 10 11:21 still logged in
root pts/1 192.168.1.100 Tue Feb 10 00:46 - 02:28 (01:41)
root pts/1 192.168.1.100 Mon Feb 9 11:41 - 18:30 (06:48)
dmtsai pts/1 192.168.1.100 Mon Feb 9 11:41 - 11:41 (00:00)
只想要第一和第三字段
[root@www ~]# last -n 5 | awk '{print $1 "\t" $3}'
root 192.168.1.100
root 192.168.1.100
root 192.168.1.100
dmtsai 192.168.1.100
awk 是以行为一次处理的单位,而以字段为最小的处理单位
awk内建变量:
变量名称                 代表意义
NF                      每一行拥有的字段总数
NR                      目前awk所处理的是第几行数据
FS                      目前的分隔字符,默认是空格符
 
awk 的格式内容如果想要以 print 打印时,记得 非变量的文字 部分, 都需要使用双引号来定义出来喔!因为单引号已经是 awk 的指令固定用法了;
例子:
[root@www ~]# last -n 5| awk '{print $1 "\t lines: " NR "\t columes: " NF}'
root lines: 1 columes: 10
root lines: 2 columes: 10
root lines: 3 columes: 10
dmtsai lines: 4 columes: 10
root lines: 5 columes: 9
awk 的逻辑运算字符
运算单元                代表意义
>                               大于
<                               小于
>=                        大于或等于
<=                        小于或等于
==                        等于
!=                         不等于
例子:
在 /etc/passwd 当中是以冒号 ":" 来作为字段的分隔
查阅第三栏小于 10 以下的数据,并且仅列出账号与第三栏
[root@www ~]# cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t " $3}'
root:x:0:0:root:/root:/bin/bash
bin 1
daemon 2
....(以下省略)....

 

怎么第一行没有正确的显示出来呢?这是因为我们读入第一行的时候,那些变数 $1,$2... 默认还是以空格键为分隔的,所以虽然我们定义了 FS=":" 了, 但是即仅能在第二行后才开始生效。那么怎么办呢?我们可以预先设定 awk 的变量啊! 利用 BEGIN 这个关键词喔!
[root@www ~]# cat /etc/passwd| awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'
root 0
bin 1
daemon 2
......(以下省略)......
用BEGIN这个关键词,从设置从开始就生效噢;
NR, NF 等变量要用大写,且不需要有钱字号 $ 啦!
有几个重要事项说明:
 awk 的指令间隔:所有 awk 的动作,即在 {} 内的动作,如果有需要多个指令辅助时,可利用分号『 ;』间隔, 或者直接以 [Enter] 按键来隔开每个指令;
 逻辑运算当中,如果是『等于』的情况,则务必使用两个等号『 ==』!
 格式化输出时,在 printf 的格式设定当中,务必加上 \n ,才能进行分行!
 与bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需要加上$符号
 
档案对比工具
diff
diff 就是用在比对两个档案之间的差异的,并且是以行为单位来比对的
举例:
假如我们要将 /etc/passwd 处理成为一个新的版本,处理方式为: 将第四行删除,第六行则取代成为『 no six line』,新的档案放置到 /tmp/test 里面,那么应该怎么做?
[root@www ~]# mkdir -p /tmp/test <==先建立测试用的目录
[root@www ~]# cd /tmp/test
[root@www test]# cp /etc/passwd passwd.old
[root@www test]# cat /etc/passwd | \
> sed -e '4d' -e '6c no six line' > passwd.new
# 注意一下, sed 后面如果要接超过两个以上的动作时,每个动作前面得加 -e才行!
# 透过这个动作,在 /tmp/test 里面便有新旧的 passwd 档案存在了!
 
 
diff [-bBi] from-file to-file
选项与参数:
from-file :一个档名,作为原始比对档案的档名;
to-file :一个档名,作为目的比对档案的档名;
注意,from-file 或 to-file 可以 - 取代,那个 - 代表Standard input 之意。
-b :忽略一行当中,仅有多个空白的差异(例如 "about me" 与 "about      me"视为相同
-B :忽略空白行的差异。
-i : 忽略大小写的不同。
 
 
总结
  • 管理主机每天任务
    • 查询登录档
    • 追踪流量
    • 监控用户使用主机状态
    • 主机各项硬件设备状态
    • 主机软件更新查询
    • 其他使用者要求
  • 脚本规范
    • script 的功能
    • script 的版本信息
    • script 的作者与联系方式
  • shell特殊变量
    • $0:脚本的文件名
    • $n:传递给脚本的参数。n是一个数字,表示第一个参数。
    • $#:参数的个数
    • $*:参数列表
    • $@:参数列表;被双引号包含时,与$*不同
    • $?:上一个命令的退出状态
    • $$:当前脚本的进程ID
  • $* 和 $@ 的区别
    • $* 和 $@ 都表示传递参数列表
    • 不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。
    • 当它们被双引号(" ")包含时,
      • "$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;
      • "$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
  • 文件测试
    • -e 该『档名』是否存在
    • -f 该『档名』是否存在且为档案(file)
    • -d 该『文件名』是否存在且为目录(directory)
  • 中括号测试注意点
    • 在中括号 [] 内的每个组件都需要有空格键来分隔;
    • 在中括号内的变数,最好都以双引号括号起来;
    • 在中括号内的常数,最好都以单或双引号括号起来。
  • read
    • 限时输入
      • read -p "Input a number:" -t 5 Number
    • 从输入中取5个字符
      • read -p "Input a word:" -n 5 Word
    • 等待输出q退出
      • read -d  q -p "Input some words end with q:" word
  • shift
    • 变量剔除替换
    • 变量1用完之后,将变量1剔除,原先的变量2,变成变量1;
    • 默认步长是1,shift 2,则步长是2;踢掉两个;
  • 条件判断式语法,for的两种写法,case语法,while的两种写法
  • function
    • function中特殊字符与shell中的特殊字符是相互独立的。
  • shell script 的debug
    • bash -nx scripts.sh
      • n,不执行,仅检测语法问题
      • x,将使用的script内容显示屏幕
  • 正则表达式
    • 常用特殊字符
      • [:alnum:],代表0-9;A-Z;a-z
      • [:alpha:],代表A-Z;a-z
      • [:upper:],代表A-Z
      • [:lower:],代表a-z
      • [:digit:],    代表0-9
    • 行首与行尾
      • ^   $
      • 找空白行
        • grep -n '^$' regular_express.text
    • 任意一个字符 .
    • 重复次数
      • * ,0次或无限次
      • +,1次或无限次
      • ?,  0次或1次
    • 连续RE字符范围{}
      • 连续两个O
        • grep -n 'o\{2\}' regular_express.txt
      • 连续2到5个
        • grep -n 'go\{2,5\}g' regular_express.txt
      • 2个以上
        • grep -n 'go\{2,\}g' regular_express.txt
  • grep 进阶
    • -A,-B,-C  n ;除匹配行之外,前,后再显示n行
      • A,after;B,before;C,是前后都显示
    • -n,带上行号显示
    • -v,反向选择
    • -i, 忽略大小写
  • sed 
    • 将数据读入模式空间中,和模式条件做匹配;符合模式条件,则在模式空间中使用后面的编辑命令对其完成编辑,并且将编辑结果输出到屏幕;并且在结束后,默认将模式空间的内容,打印出来。
    • 默认不编辑源文件,仅对模式空间上的数据做处理;
    • 逐行处理
  • awk
    • 将数据分成几个字段来处理
    • 以行为一次处理的单位,而以字段为最小的处理单位
  • diff
    • 档案对比工具
    • 用在比对两个档案之间的差异,以行为单位来对比
 
 

转载于:https://www.cnblogs.com/Aiapple/p/4917917.html

相关文章:

  • Ubuntu系统更新命令笔记
  • 大龄屌丝自学笔记--Java零基础到菜鸟--038
  • VMWare虚拟机提示:锁定文件失败,打不开磁盘的解决办法
  • HDU2030 汉字统计
  • Windows下删除不需要的服务
  • [原创] SQLite数据库使用清单(下)
  • Oracle11g安装详细步骤【有图在里边哦】
  • Myeclipse链接Oracle等数据库时lo exception: The Network Adapter could not establish the connection
  • taglib的使用
  • Oracle解锁封锁的账号
  • 期中总结
  • Web应用解决中文乱码的两种方式
  • Linux平台下线程同步,实现“生产者消费者问题”
  • aaaa
  • Hibernate懒加载策略
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 2019年如何成为全栈工程师?
  • css布局,左右固定中间自适应实现
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Laravel Telescope:优雅的应用调试工具
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • MySQL的数据类型
  • windows下mongoDB的环境配置
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 服务器之间,相同帐号,实现免密钥登录
  • 诡异!React stopPropagation失灵
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 阿里云移动端播放器高级功能介绍
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #etcd#安装时出错
  • $().each和$.each的区别
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (二)JAVA使用POI操作excel
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (实战篇)如何缓存数据
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转载)Google Chrome调试JS
  • .dwp和.webpart的区别
  • .NET Core 中插件式开发实现
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 解决重复提交问题
  • .NET 中 GetProcess 相关方法的性能
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • @SuppressWarnings(unchecked)代码的作用
  • @Transactional类内部访问失效原因详解
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用