东子破解2

我们今天讲的是bash:

今天是最有用的。
ls /bin/×.sh 可以看到我们要看到的
所有的shell
strace ls(命令) 查看各种命令的api

ksh 。。。ibm 公司的shell aix系统的

bash的内部命令which  echo $APTH
echo $PATH
放到 path中的命令是外部命令

man bash 查看外部命令

bash 内部名命的令:
alias 设置bash别名
bg 使一个被进程挂起在后台继续执行
cd 改变当前工作目录
exit终止shell
export 使变量的值对当前shell的所有子进程
都可见
fc 用来编辑历史命令里的命令
使一个被挂起的进程在前台继续执行
help kill pwd
----------
PATH =$PATH:/目录
我们这个是一个临时目录当我们重启电脑的时候
就恢复了。
取出变量的值 echo

echo PS1="c:\\" PS1变量里面的内容
man bash
env 全局变量
set 查看变量  取出值的时候 $变量值
pstree | grep -A2 -B2 pstree

export AA=aaaaa 环境变量
PATH PS1 EXPORT

当我们运行脚本的时候默认的时候是打开一个
子shell的 所以我们要定义一个环境变量的。

bash的特性:

 

-----------------
ctrl+R 在命令历史多的时候我们来搜索
history ,!! 上一条历史,!$ 上一个命
令的最后一个参数,!数字 表示第几号命令
2012/8/11

变量 和环境变量区别://TODO

bash中运算符 //TODO
* ?[] ^ {}
touch {}-{}枚举
~ - @ # %1 ()声明函数
'' "" `
双引号 只是屏蔽空格的结束的作用
单一号 屏蔽所有的屏蔽说有的字符的作用
反引号 里面的命令是先执行一下

\ 脱衣服

; 分号是命令的结束
-f 是文件吗  -d 是目录吗
[空格 -f东西 空格] 判断 和 &&与 短路 

||或 短路  $[算数表达]
()函数 子shell
man bash

-----------------
四个脚本:
/etc/profile 所有的
  ~/.bash_profile
  ~/.bashrc
/etc/bashrc  所有的

一个公用的 和一个自用 的文件。
su - shrek 执行的全部的文件

------------------------------------
---命令1<>&&<>命令2
这种命令执行方式相当地直接。& &左边的命令(命令1)返回真(即返回0,成功被执行)
后,& &右边的命令(命令2)才能够被执行;换句话说,“如果这个命令执行成功& &那么执
行这个命令”。

---命令1<>||<>命令2

如果| |左边的命令(命令1)未执行成功,那么就执行| |右边的命令
(命令2);或者换句话说,“如果这个命令执行失败了|| 那么就执行这个命令”

--用()和{ }将命令结合在一起
如果希望把几个命令合在一起执行, s h e l l提供了两种方法。既可以在当前s h e l l也可以在
子s h e l l中执行一组命令。
为了在当前s h e l l中执行一组命令,可以用命令分隔符隔开每一个命令,并把所有的命令
用圆括号()括起来。
它的一般形式为:
(命令1;命令2;. . .)
如果使用{ }来代替(),那么相应的命令将在子s h e l l而不是当前s h e l l中作为一个整体被执
行,只有在{ }中所有命令的输出作为一个整体被重定向时,其中的命令才被放到子s h e l l中执
行,否则在当前s h e l l执行。它的一般形式为:
{命令1;命令2;. . . }
我很少单独使用这两种方法。我一般只和& &或| |一起使用这两种方法。

------------------
文本过滤
正则表达式介绍
基本元字符使用在g r e p和s e d命令中
,同时结合{ \ \ }(以字符出现情况进行匹配的元字符)使用在a w k语言中。
^ 只只匹配行首
$ 只只匹配行尾
* 只一个单字符后紧跟*,匹配0个或多个此单字符
[ ] 只匹配[ ]内字符。可以是一个单字符,也可以是字符序列。可以使用-
表示[ ]内字符序列范围,如用[ 1 - 5 ]代替[ 1 2 3 4 5 ]
\ 只用来屏蔽一个元字符的特殊含义。因为有时在s h e l l中一些元字符有
特殊含义。\可以使其失去应有意义
. 只匹配任意单字符
p a t t e r n \ { n \ } 只用来匹配前面p a t t e r n出现次数。n为次数
p a t t e r n \ { n,\ } m 只含义同上,但次数最少为n
p a t t e r n \ { n,m \ } 只含义同上,但p a t t e r n出现次数在n与m之间
现在

例子:

^ 对行首
$ 对行尾
^ [ t h e ] 对以t h e开头行
[ S s ] i g n a [ l L ] 对匹配单词s i g n a l、s i g n a L、
S i g n a l、S i g n a L
[Ss]igna[lL]\. 对同上,但加一句点
[ m a y M A Y ] 对包含m a y大写或小写字母的

^ U S E R $ 对只包含U S E R的行
[tty]$ 对以t t y结尾的行
\ . 对带句点的行
^ d . . x . . x . . x 对对用户、用户组及其他用户
组成员有可执行权限的目录
^ [ ^ l ] 对排除关联目录的目录列表
[ . * 0 ] 对0之前或之后加任意字符
[ 0 0 0 * ] 对0 0 0或更多个
[ iI] 对大写或小写I
[ i I ] [ n N ] 对大写或小写i或n
[ ^ $ ] 对空行
[ ^ . * $ ] 对匹配行中任意字符串
^ . . . . . . $ 对包括6个字符的行
[a- zA-Z] 对任意单字符
[ a - z ] [ a - z ] * 对至少一个小写字母
[ ^ 0 - 9 \ $ ] 对非数字或美元标识
[ ^ 0 - 0 A - Z a - z ] 对非数字或字母
[ 1 2 3 ] 对1到3中一个数字
[ D d ] e v i c e 对单词d e v i c e或D e v i c e
D e . . c e 对前两个字母为D e,后跟两个
任意字符,最后为c e
\ ^ q 对以^ q开始行
^ . $ 对仅有一个字符的行
^\.[0-9][0-9] 对以一个句点和两个数字开始
的行
' " D e v i c e " ' 对单词d e v i c e
D e [ V v ] i c e \ . 对单词D e v i c e或d e v i c e
[ 0 - 9 ] \ { 2 \ } - [ 0 - 9 ] \ { 2 \ } - [ 0 - 9 ] \ { 4 \ } 对日期格式d d - m m - y y y y
[ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } 对I P地址格式nnn. nnn.nnn.nnn
[ ^ . * $ ] 对匹配任意行
-------------
grep 家族
g r e p(全局正则表达式版本)对文本文件进行模式查找g r e p有三种变形。

G r e p:标准g r e p命令,本章大部分篇幅集中讨论此格式。
E g r e p:扩展g r e p,支持基本及扩展的正则表达式,但不支持\ q模式范围的应用,与之相
对应的一些更加规范的模式,这里也不予讨论。
F g r e p:快速g r e p。允许查找字符串而不是一个模式。不要误解单词f a s t,实际上它与g r e p
速度相当。

g r e p一般格式为:
grep [选项]基本正则表达式[文件]
这里基本正则表达式可为字符串。
常用的g r e p选项有:
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。

< Ta b >表示点击t a b键。
使用g r e p抽取精确匹配的一种更有效方式是在抽取字符串后加\ >
缺省情况下, g r e p是大小写敏感的,如要查询大小写不敏感字符串,必须使用- i开关。

使用grep匹配“与”或者“或”模式

g r e p命令加- E参数,这一扩展允许使用扩展模式匹配。

空行
结合使用^和$可查询空行。使用- n参数显示实际行数:

grep '^$' myfile


使用带有ps x命令的g r e p可查询系统上运行的进程。ps x命令意为显示系统上运行的所有进程列表。要查看D N S服务器是否正在运行(通常称为n a m e d),方法如下:
ps ax | grpe "named"

AWK 介绍
如果要格式化报文或从一个大的文本文件中抽取数据包,那么a w k可以完成这些任务。
a w k是所有s h e l l过滤工具中最难掌握的
有三种方式调用a w k,第一种是命令行方式,如:
awk [-F field-separator] 'commadns' input-file(s)
这里,c o m m a n d s是真正的a w k命令。本章将经常使用这种方法。
上面例子中, [ - F域分隔符]是可选的,因为a w k使用空格作为缺省的域分隔符,因此如果
要浏览域间有空格的文本,不必指定这个选项,但如果要浏览诸如p a s s w d文件,此文件各域
以冒号作为分隔符,则必须指明- F选项,如:
awk -F:'commands' input-file
第二种方法是将所有a w k命令插入一个文件,并使a w k程序可执行,然后用a w k命令解释
器作为脚本的首行,以便通过键入脚本名称来调用它。
第三种方式是将所有的a w k命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
- f选项指明在文件a w k s c r i p t f i l e中的a w k脚本, i n p u t f i l e ( s )是使用a w k进行浏览的文件名。
a w k执行时,其浏览域标记为$ 1,$ 2 . . . $ n。这种方法称为域标识。使用这些域标识将更容
易对域进行进一步处理。
使用$ 1 , $ 3表示参照第1和第3域,注意这里用逗号做域分隔。如果希望打印一个有5个域
的记录的所有域,不必指明$ 1 , $ 2 , $ 3 , $ 4 , $ 5,可使用$ 0,意即所有域。Aw k浏览时,到达一新
行,即假定到达包含域的记录末尾,然后执行新记录下一行的读动作,并重新设置域分隔。
注意执行时不要混淆符号$和s h e l l提示符$,它们是不同的。
为打印一个域或所有域,使用p r i n t命令。这是一个a w k动作(动作语法用圆括号括起来)。

$ awk '{print $0}' grade.txt >wow
使用这种方法要注意,显示屏上不会显示输出结果。因为它直接输出到文件。只有在保
证输出结果正确时才会使用这种方法。它也会重写硬盘上同名数据。
第二种方法是使用t e e命令,在输出到文件的同时输出到屏幕。在测试输出结果正确与否
时多使用这种方法。例如输出重定向到文件d e l e t e m e a n d d i e,同时输出到屏幕。使用这种
方法,在a w k命令结尾写入| tee delete_me_and_die。
$ awk '{print $0}' grade.txt | tee delete_me_and_die
3. 使用标准输入
在深入讲解这一章之前,先对a w k脚本的输入方法简要介绍一下。实际上任何脚本都是从
标准输入中接受输入的。为运行本章脚本,使用a w k脚本输入文件格式,例如:
$ belts.awk grade_student.txt
也可替代使用下述格式:
使用重定向方法:
$ balts.awk <grade2.txt
或管道方法:
$ grade2.txt|belts.awk
4. 打印所有记录
$ awk '{print $0}' grade.txt

\ ^ $ . [] | () * + ?
这里有两个字符没有讲到,因为它们只适用于a w k而不适用于g r e p或s e d。它们是:
+ 使用+匹配一个或多个字符。
? 匹配模式出现频率。例如使用/X Y?Z/匹配X Y Z或Y Z。

操作符描述操作符描述
< 小于 > = 大于等于
< = 小于等于~ 匹配正则表达式
= = 等于!~ 不匹配正则表达式

为使一域号匹配正则表达式,使用符号‘~’后紧跟正则表达式,也可以用i f语句。a w k
中i f后面的条件用()括起来。
观察文件g r a d e . t x t,如果只要打印b r o w n腰带级别可知其所在域为f i e l d - 4,这样可以写出
表达式{if($4~/brown/) print }意即如果f i e l d - 4包含b r o w n,打印它。如果条件满足,则打印匹
配记录行。可以编写下面脚本,因为这是一个动作,必须用花括号{ }括起来。
$ awk '{if($4~/Brown/) print $0}' grade.txt

$ awk '{if($3~/48/) print $0}' grade.txt

$ awk '$3=="48" {print $0}' grade.txt


&& AND : 语句两边必须同时匹配为真。
|| O R:语句两边同时或其中一边匹配为真。
! 非求逆

$ awk '{if ($1=="p.Bunny" && $4=="Yellow")print $0}' grade.txt

$ awk '{if($4=="Yellow" || $4~/Brown) print $0}' grade.txt

awk内置变量
a w k有许多内置变量用来设置环境信息。这些变量可以被改变。表9 - 3显示了最常使用的
一些变量,并给出其基本含义。
表9-3 awk内置变量
A R G C 命令行参数个数
A R G V 命令行参数排列
E N V I R O N 支持队列中系统环境变量的使用
FILENAME a w k浏览的文件名
F N R 浏览文件的记录数
F S 设置输入域分隔符,等价于命令行- F选项
N F 浏览记录的域个数
N R 已读的记录数
O F S 输出域分隔符
O R S 输出记录分隔符
R S 控制记录分隔符
eg:
$ awk 'END (print NR)' grade.txt

$ awk '{print NF,NR,$0}END{print FILENAME}' grade.txt

$ awk '{if (NR>0 && $4~/Brown/)print $0}' grade.txt
N F的一个强大功能是将变量$ P W D的返回值传入a w k并显示其目录。这里需要指定域分隔
符/。
$ pwd
/user/local/etc
$ echo $PWD | awk -F/ '{print $NF}'
etc
另一个例子是显示文件名。
$ echo "/usr/local/etc/rc.sybase" |
 awk -F/ '{print $NF}' rc.sybase

 增加列值
为增加列数或进行运行结果统计,使用符号+ =。

 

awk操作符
在a w k中使用操作符,基本表达式可以划分为数字型、字符串型、变量型、域及数组元素,
前面已经讲过一些。下面列出其完整列表。
在表达式中可以使用下述任何一种操作符。
= += *= / = %= ^ = 赋值操作符
? 条件表达操作符
|| && ! 并、与、非(上一节已讲到)
~!~ 匹配操作符,包括匹配和不匹配
< <= == != >> 关系操作符
+ - * / % ^ 算术操作符
+ + -- 前缀和后缀


内置的字符串函数
a w k有许多强大的字符串函数,见表9 - 4。
表9-4 awk内置字符串函数
g s u b ( r, s ) 在整个$ 0中用s替代r
g s u b ( r, s , t ) 在整个t中用s替代r
i n d e x ( s , t ) 返回s中字符串t的第一位置
l e n g t h ( s ) 返回s长度
m a t c h ( s , r ) 测试s是否包含匹配r的字符串
s p l i t ( s , a , f s ) 在f s上将s分成序列a
s p r i n t ( f m t , e x p ) 返回经f m t格式化后的e x p
s u b ( r, s ) 用$ 0中最左边最长的子串代替s
s u b s t r ( s , p ) 返回字符串s中从p开始的后缀部分
s u b s t r ( s , p , n ) 返回字符串s中从p开始长度为n的后缀部分
------------
字符串屏蔽序列
使用字符串或正则表达式时,有时需要在输出中加入一新行或查询一元字符。
打印一新行时,(新行为字符\ n),给出其屏蔽序列,以不失其特殊含义,用法为在字符
串前加入反斜线。例如使用\ n强迫打印一新行。
如果使用正则表达式,查询花括号( { }),在字符前加反斜线,如/ \ { /,将在a w k中失掉其
特殊含义。
awk中使用的屏蔽序列
\ b 退格键\ t t a b键
\ f 走纸换页\ d d d 八进制值
\ n 新行\ c 任意其他特殊字符,例如\ \为反斜线符号
\ r 回车键

$ awk 'BEGIN {print"\n\May\tDay\nMay \104\141\171"}'

awk输出函数printf
p r i n t f函数基本语法是p r i n t f([格式控制符],参数),格式控制字符通常在引号里。

- 左对齐
Wi d t h 域的步长,用0表示0步长
. p r e c 最大字符串长度,或小数点右边的位数
表9-7 awk printf格式
% c A S C I I字符
% d 整数
% e 浮点数,科学记数法
% f 浮点数,例如(1 2 3 . 4 4)
% g a w k决定使用哪种浮点数转换e或者f
% o 八进制数
% s 字符串
% x 十六进制数

1. 字符转换
观察A S C I I码中6 5的等价值。管道输出6 5到a w k。p r i n t f进行A S C I I码字符转换。这里也加
入换行,因为缺省情况下p r i n t f不做换行动作。
$ echo "65" | awk '{printf "%c\n",$0}

$ awk 'BEGIN {printf "%c\n",65}'
下面的例子表示进行浮点数转换后‘ 9 9 9’的输出结果。整
数传入后被加了六个小数点。
$ awk 'BEGIN {printf "%f\n",999}

2. 格式化输出
打印所有的学生名字和序列号,要求名字左对齐, 1 5个字符长度,后跟序列号。注意\ n换行符放在最后一个指示符后面。输出将自动分成两列。
$ aek {printf "%-15s %s\n",$1,$3}' grade.txt

向一行a w k命令传值
在查看a w k脚本前,先来查看怎样在a w k命令行中传递变量。
在a w k执行前将值传入a w k变量,需要将变量放在命令行中,格式如下:
awk 命令变量=输入文件值
(后面会讲到怎样传递变量到a w k脚本中)。
下面的例子在命令行中设置变量A G E等于1 0,然后传入a w k中,查询年龄在1 0岁以下的所有学生。
$ awk '{if ($5<AGE)print $0}' AGE=10 grade.txt

$ df -k | awk '($4 ~/^[0-9]/) {if($4<TRIGGER} print $6"\t"$4}' TRIGGER=56000

-------------------

awk脚本文件
可以将a w k脚本写入一个文件再执行它。命令不必很长(尽管这是写入一个脚本文件的主
要原因),甚至可以接受一行命令。这样可以保存a w k命令,以使不必每次使用时都需要重新
输入。使用文件的另一个好处是可以增加注释,以便于理解脚本的真正用途和功能。
使用前面的几个例子,将之转换成a w k可执行文件。像原来做的一样,将学生目前级别分
相加awk ‘(t o t + = $ 6) END{print "club student total points:" t o t }’ g r a d e . t x t。
创建新文件s t u d e n t t o t . a w k,给所有a w k程序加入a w k扩展名是一种好习惯,这样通过查
看文件名就知道这是一个a w k程序。文本如下:
!/bin/awk -f
#all comment lines must start with a #hash "#"
#name:student_tot.awk
# to call:student_tot.awk grade.txt
# prints toal and average of club #student points

#print a header first
BEGIN{
print "Student Dat member no grade age points Max"
print "Name Joined "
print "==================="
(tot+=$6)
END{print "Club studet total points:" tot print "average Club Student points:" tot/Nr}
}

执行的时候:
chmod u+x student_tot.awk
student_tot.awk grade.txt

85page

你可能感兴趣的:(正则表达式,shell,脚本,bash,扩展,破解)