Chinaunix首页 | 论坛 | 博客
  • 博客访问: 118295
  • 博文数量: 42
  • 博客积分: 932
  • 博客等级: 准尉
  • 技术积分: 470
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-18 22:33
文章分类
文章存档

2011年(42)

分类: LINUX

2011-07-23 20:41:48

  今天突然发现个问题,感觉写出来的博客还是凌乱!觉得有空的话我还会把总结过得东西分类再整理下!由于在学习的过程中,老师有自己的节奏并尽可能的教给我们现在能用的到,或者以后会经常用到的命令,在教学的过程中也可能会突然补充一些为了解决某个特定问题而需要提前用到的命令,随着学习的深入以后学到的命令或需要记的东西会越来越多,不分门别类是不行得,所以抽时间会发俩篇专门关于命令的会实时更新学到的命令!在以后写微博的时候我也会尽可能的写的清楚些!这也是为了加强总结和复习的效果!废话不多说看看今天学到的新内容!今天学的新内容包括以下几点
1、sed的基本知识
2、awk基础用法

3、sort uniq的基本介绍
4、vim文本编辑工具的基本介绍
5、脚本编程的条件判断与测试
6、if和while俩种循环
  首先我们还是复习了下grep,egrep,fgrep这个在上次最后总结的很详细了!这里不多说,就说一个新接触到的!在基本正则表达式里有个词首和词尾的定位符分别是:
\<  ,  \>这俩个符号都能用\b来代替,即\b技能限定词首又能限定词尾!这能使我们以后在写匹配条件的时候更加清晰点。
回顾一个例子吧!我们要找出包含了以C或c开头的词的行!
我们可以这样来写:grep "\b[Cc][[:alpha:]]*\b" file
                  grep -E "\b(C|c)[[:alpha:]]*\b" file
这里说一点就是这个匹配出来的是以C或c头的后跟任意多个字母并以字母结尾的字符串!并不可能说用grep能识别有意义的单词 所以他能匹配出 Czzzzzzz这种东西!还有在用 -E这句的时候别忘了(C|c)的小括号!
 下面说下今天学的新内容
1.sed :stream editor 流/行编辑器
特征:
非交互式的编辑器
sed本身没有破坏性 它不修改原文件的内容,只是把源文件的每一行先读到内存中,在内存中修改后再显示在屏幕上!
sed本身还支持sed脚本
sed 是一个行编辑器,它逐行处理要被处理对象文件的内容,并会把结果输送至屏幕
sed一个重要概念之一 sed的模式空间:sed用模式来处理内容的时候所占的内存空间也叫缓冲区
sse的使用格式:
sed [options] /PATTERN/COMMAND files....
用法示例 sed /cache/p /proc/cpuinfo
         sed /cache/,/wp/p /proc/cpuinfo
地址模式可以有多种实现的方式在接下来的例子中用到的话再解释
sed [options] ADDR1,ADDR2/COMMAND(sed自身自由的内部编辑命令)
用法示例 sed 1,3p /proc/cpuinfo
另外说说明:sed的在模式匹配的时候支持正则表达式在后面的例子也会用到
还有应注意在LINUX中同一个字符会有多种意义甚至是在同一种用法中有多种意义,这就要求一定要记清并理解每个字符在用的时候的意义!
例如:sed -n /^[^Cc]/p /proc/cpuinfo中 ^ 这个字符的意义!第一个是行首限定 第二个是取反的意思!
sed常用的几个命令:
        p 打印显示匹配到的行
        d 删除匹配到的行
        a\ 在匹配到的行之后添加新行 \n可以添加多行即将添加的行分多行显示
        i\ 在匹配到的行之前添加新行
        s 查找替换 地址 s/ / /gi
s 的特殊用法 sed "ADDR1,ADDR2s/ 串/串 /ig" 第一个串是查找的串支持正则表达式,第二个是用来替换查找到的串的串!i是忽视大小写的意思 g是全局查找的意思,sed默认是替换在这一行中第一次匹配的串,加g就替换这行中所有匹配到的串!
额外补充个东西:$ 在地址匹配的时候代表这个文本中最后一行的意思
               
如:sed '1,$s/\bc/C/g' file 就是匹配这个文本中从第一行开始到最后一行结束把所有以小c开头的词都替换为大C s同样支持正则表达式!支持的元字符跟grep基本一致 多了个&用于保存整个查找到的串以便于以后的引用!
如:sed '1,$s/\b[Cc]pu\b/&s/g' /proc/cpuinfo
下面是部分结果
cpus family : 6
model  : 15
model name : Intel(R) Pentium(R) Dual  CPU  T3200  @ 2.00GHz
stepping : 8
cpus MHz
注意看cpu 后面都多了个s
以上的操作都不会改变文件原有的内容如果我们想改变源文件的内容就要用到几个选项
常用的几个选项:
   -n 避免输出模式空间里没有匹配的行
   -e 允许多项编辑
   -f 读取sed脚本
   -i 直接修改原文件 一个危险的操作!
-e的用法
如: sed '1,$s/\b[Cc][[:alpha:]_]*\b/&s/g' /proc/cpuinfo | sed '1,$s/\bm\([[:alpha:]_]*\)\b/M\1/g'
我们用-e的命令就可以写成如下格式:
sed '1,$s/\b[Cc][[:alpha:]_]*\b/&s/g' -e '1,$s/\bm\([[:alpha:]_]*\)\b/M\1/g' /proc/cpuinfo
好的解释下我写的这个是什么意思 也请大家看看有没有错误
将/proc/cpuinfo 里所有以c或C开头的词后加s 所有以m开头的词都换成M开头
好的下面再总结下sed 指定地址的几种方法
n1,n2   从n1行到第n2行
first~step
$  用于匹配最后一行
/regexp/ 指定的模式匹配
addr1,+N 从addr1开始往后的N行
以上就是我们所学的sed的基本用法了!这可能只是sed这个强大的东西的冰山一角!下面再附上几个课堂上的练习!
1、将/etc/inittab文件中以id开头后面跟了两个冒号且两个冒号间有一个数字的那一行中的那两个冒号间的数字改为3;
2、将/etc/passwd文件中以n开头的所有单词的词首字母改为大写;
3、在/proc/meminfo文件中所有以HugePages开头的行后面添加“# For performancing”一个新行;
4、删除/etc/inittab文件中所有以#开头,或者以一些空白字符后跟一个#开头的行,并且将所有以一个空格后跟一个数字结尾的行中的那个行尾的数字改为0;
写一个脚本:
1、将/var/目录下所有文件的文件名的首字母和尾字母显示时改为大写;
写一个脚本:
1、将/etc/sysctl.conf文件中以非#(井号)开头的行保存至/tmp/sysctl.conf中
2、如果/tmp/sysctl.conf文件中net.ipv4.ip_forward的值为0的话,则将其值修改为1
3、按次序逐个显示等于号之前的指令的名字,并在每一个指令名字添加其编号,形如:
  1 net.ipv4.ip_forward
  2 kernel.sysrq
4、为/tmp/sysctl.conf文件中的每一行添加注释,即在每一非空白行之前添加一个以#开头的行,并保存至文件中。内容形如:
   # A parameter.
由于练习题题目是复制过来的 在下面写答案似乎会出问题所以部分答案如下
这个题的要求是不更改文件内容的这事附加的条件:sed '1,$s/^id:[0-9]:/id:3:/g' /etc/inittab结果部分如下:#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:  此行就是被替换的行 定义了开机默认界面是命令行模式 5是图形化
 sed '1,$s/\bn\([[:alpha:]]*\)/N\1/g' /etc/passwd部分结果:
daemon:x:2:2:daemon:/sbin:/sbin/Nologin
adm:x:3:4:adm:/var/adm:/sbin/Nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/Nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/Nologin
News:x:9:13:News:/etc/News:
3 4就不写了太有兴趣的同学可以再自己试试!
脚本在最后发上要不太乱!
接下来要看的一个知识点是awk
awk,文本处理命令 1977年诞生于贝尔实验室  ——>nawk
2、gnu awk = gawk
  最基础的用法
awk的格式:
  gawk options 'program' file
   pattern {action}
   pattern {action}’
  ....
pattern 模式起到的是过滤作用,就是在action处理之前先过滤以下,只处理模式匹配到的行
       不指定pattern将默认对整个文本进行处理
       依然是用正则表达式用于匹配 且默认不区分大小写
用法:
/regular expression/正则表达式匹配
Expression 较复杂暂时没讲 只知道能做模糊匹配
特殊模式
BEGIN  通常用于实现改变内建变量的值 或者在输出信息之前打印标题的只执行一次不会在每一行都执行
如:awk 'BEGIN {print " Decices         mount point"} {print $0}' /etc/fstab 结果如下多了上面一行
Decices         mount point
/dev/vol0/root          /                       ext3    defaults        1 1
/dev/vol0/home          /home                   ext3    defaults        1 2
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
LABEL=SWAP-sda3         swap                    swap    defaults        0 0

END 与BEGIN相反做些扫尾的工作

action 指明做出怎么样的处理
awk事实上也是行编辑器
awk 默认将读入的每一行以空格作为分隔符进行切片每一片称为field能当做变量被引用
     从前至后一次是$1,$2.....整行是$0
       可能一次读进多行每行称为一个record
几个常用的内建变量
FS 指定输入时的字段段分隔符
如gawk 'BEGIN{FS=":"} {print $1} /etc/passwd
大家知道/etc/passwd下内容是什么吧!
user1:x:504:504::/home/user1:/bin/bash
user2:x:505:505::/home/user2:/bin/bash
user3:x:506:506::/home/user3:/bin/bash
user4:x:507:507::/home/user4:/bin/bash
就是这些东东!如果不指定FS=":" 就默认以空格进行分隔那么显示出来的就是上面这些再看看执行上面那个命令后的结果这就是指定字段分割符的作用以下几个内置变量大致都是如此!不能插图好难受啊!
user1
user2
user3
user4

RS 指定输入时的行分隔符
OFS  指定输出时的字段分隔符
ORS 指定输出时的行分隔符
NF 每一行有多少字段
NR 正在被处理的行在文件中是第几行
awk的功能十分强大然而我们现在使用的功能甚少等以后学的更多的时候再继续补充这一块!
下来终于迎接来了vim这个强大的编辑工具
3、sort 文本排序
   -n 按数值大小排序
   -u 不显示重复的行
   -r 降序排列
   -t 指定段分割符 -k 指定以那个段进行排序
uniq 有点类似 sort -u
uniq
 -u 只显示不重复的行
 -d 只显示重复的行
 -c 能告诉你重复的行出现过几次
4、vim:文本编辑工具
vi ,emacs 俩款强大的编辑器
vi聚焦的特点使其称为诸多LINUX默认的编辑器
vim 是vi 的增强版!
vim模式化的编辑器
最重要的3种模式
命令模式 最基本的模式 也叫编辑模式 在此模式下大多数的键盘敲击动作都是编辑命令例如说删除字符,复制内容等;这在下面会有介绍!
输入模式 在此模式下大多数的键盘敲击动作都是直接将字符输入进去!
末行模式 能实现对vim自身的配置,也能实现命令模式下的大多编辑命令
模式转换
在命令模式下用":"这个命令可以进入末行模式
怎么退出vim
在末行模式
:q
:q!不保存退出
:x,:wq保存退出
命令模式下:ZZ
从末行模式回到命令模式按两次Esc键
如何从命令模式进入插入
i,I:插入,在当前光标的字符前/当前光标所在行前插入新内容
a,A:追加
o,O:上行 下行
如何从插入模式返回命令模式按 Esc键
如何打开vim
vim +n 打开vim 并指定光标所在的行
vim +/模式匹配 光标处于第一次匹配到的行的行首
在vim中命令模式下光标移动:h,j,k,l 向前 下 上 后
                  w向行尾一次移动一个单词 跳到下一个单词的词首
                  b前一个单词的词首
                  e跳到下一个单词的词尾
                  ^跳到本行第一个非空白字符处,
                   0跳到绝对行首
                   $跳到绝对行尾
                   G nG快速实现行间移动 10G跳到第10行
                   单词间跳转跟行间跳转都能与数字连用
                   x 删除一个字符
                   d 跟范围表达式组和指定删除的模式
                    ndd删除光标以下的n行
                    同样能和 w b e 等一起使用
在末行模式下使用d  :10,100d 删除第10行到第100行
                    :.表示光标所在的行
                       1,.  .,$ 从第一行到最后一行
                                        .,$-2d     从光标所在的行到倒数第3行
                                        .,+5d    从光标所在的行到接下来的5行
翻屏功能:crtl+f往文件尾部翻一屏 ctrl+b键往前翻一屏
          crtl+d/u翻半屏
修改:
c 删除一些内容再转入插入模式
复制和粘贴
y复制
yy复制一行 nyy复制光标以下n行
小写p:如果复制的是行在当前光标下面粘贴一行
大写p: 跟上面对应
u一次撤销一个操作
U撤销此前所有操作
Ctrl+r能实现撤销“撤销”
.:redo 将上一个命令重复执行
可视化模式
v 逐字符移动
V 逐行移动
移动文本
d,p实现剪切
多窗口打开
一次打开多个文件:
怎么在文件间切换
:next prev first last 下一个/上一个/第一个/最后一个
分割窗口
Ctrl+w,s:水平分割窗口
Ctrl+w,v:横向分割窗口 分割显示有个用途就是实现文件间的内容的移动
Ctrl+w,Ctrl+w跳转到下一个窗口Ctrl+w+箭头跳转
vim -O -o一次打开多个文件并实现窗口分割
定制vim的工作特征:
:set nu 编号
:set nonu 不编号
vim的配置文件 /etc/vimrc,~/.vimrc
set ai 自动缩进
set noai 不缩进
set ic 忽略字符大小写
set sm 显示俩个花括号跟谁匹配
set nosm
sytax on 语法高亮
vimtutor vim教程如果大家还不清楚可以查看此教程进行练习!

5、脚本编程的条件判断
判断:bash
bash -n a.sh可以检查脚本语法错误
bash -x 可以调试执行 显示每一步的执行结果
test expression
[ expression ]
[[ expression ]]
以上是实现条件测试的功能即要想做出判断就要对条件进行测试下面将介绍条件测试:

条件测试:3种
整数测试
-lt,[ $A -lt $B ]测试A是否小于B
-le,小于等于
-gt,大于
-ge,大于等于
-eq,等于
-ne,不等于
测试脚本实现比较俩个数的大小并将较大的数输出出来
#!/bin/bash
  2 # author:yn
  3 # filename:bc2.sh
  4 # date:2011-07-24-12-00-28
  5 # version:0.0.1
  6 [ $1 -ge $2 ] && echo "$1 is the max num." || echo "$2 is the max num."
第6行就是这个脚本的内容了!经过测试了!

字符串测试
==判断俩个字符串是否一样 == 前后加空格
>
<
-z判断一个字符串是否为空 空值为真
-n判断一个字符处啊是否为空 不空为真

文件测试
-e FILE 判断一个文件是否存在
-f 判断一个文件是否是普通文件
-d 判断一个是否是一个目录文件
-h/-L 判断一个文件是否是一个符号链接文件
-r 判断一个文件的是否可读这个取决于使用者
-w     判断一个文件的是否可写这个取决于使者
-x 判断一个文件的是否可执行这个取决于使用者
-s 判断文件是否为空
-O 判断这个脚本的发起者是不是就是这个文件的属主
-G  判断这个脚本的发起者是不是就是这个文件的属组

组合条件测试:
-a [-x $FILE -a -w $FILE ] 同时有可执行和写权限
-o 或者 两者之一即可
-not,!取反
if条件循环的使用方法格式:

if CONDITION;then
 statement
....
fi
if CONDITION;then
 statement
....
else
 statement
....
fi

if CONDITION;then
 statement
...
elif CONDITION;then
 statement
....
elif CONDITION;then
 statement
....
else
 statement
...
fi
数学运算符
+
_
*
/
% 取模
+=  SUM+=1,SUM=$[$SUM+1]
++ SUM++
-- SUM--
--
bash -n 检查语法错误

`seq 2 2 100` 从2 开始 一次递增2 到100
 


循环方法
while CONDITIO;do
statment
done

read 允许与用户互动让用户通过键盘输入数值
下面附上个脚本


这是上面将/var目录下的文件名的首字母和尾字母都换成大写的脚本和执行结果

最后再附俩个脚本一个关于if的一个关于while的 不再插测试结果了!

if

写一个脚本:
1)让用户通过命令行传递一个路径;
2)判断:
 如果是普通文件,显示之;
 否则,如果是目录,显示之;
 否则,如果是链接,显示之;
 否则,显示无法识别

脚本如下:


while

写一个脚本计算1-100的和用while的实现 前面已经用for循环实现过了







































































阅读(1384) | 评论(0) | 转发(0) |
0

上一篇:LINUX学习之路3

下一篇:LINUX学习之路5

给主人留下些什么吧!~~