Lecture 6
12月29号整理
bash shell 快捷键 提供命令编辑功能
Ctrl+a 将光标快速移到命令行首部
Ctrl+e 将光标快速移到命令行行尾
Ctrl+ —> (<—)一次移动一个单词
Ctrl+k 删除当前光标至命令行尾部的内容
Ctrl+u 删除当前光标至命令行首部的内容
Ctrl+l 或者clear都是用来清屏的
(emacs风格) set –o vi 转换为vi风格
文件名通配
* 匹配零到任意个、任意长度的字符
?匹配任意单个字符 eg:ab?d.mp3 匹配abcd.mp3
[]指定一个取值范围的单个字符,匹配只能从中括号中的字符选取
[0-9] [a-z] [:alpha:] 大小写字母 本身就是一个集 要想使用的话再加上一个中括号eg [[:alpha:]]b.mp3
[:lower:]小写字母 [:upper:]大写字母 [;digit;]数字 [:punct:]标点符号
[;alnum;]字母和数字 [:space:]空白字符 文件名通配
rm –f *.doc
file 查看文件
命令行展开 ~,{},
ls ~redhat
touch {a b}_{c d}
shell 应用程序,提供用户作为系统接口
命令
编程功能
软件编程:编译类:源代码——》目标代码(编译) C C++ java
脚本类:源代码 (解释器 bash) 一般来说 面向应用层
脚本语言:perl(redhat 5.8)面向过程
python面向对象 更适合于构建大型应用
ruby (on rail)日本
shell
shell, bsh(sh) 标准shell 开发者bourn 1979年 贝尔实验室
Bill joy 伯克利大学 csh——>tcsh(改进版) FreeBSD 默认cshell
korn,ksh,GNU ksh(跟原来的ksh不是一回事)
bourn again shell bash shell 遵循GPL Linux目前使用最广泛的
zsh 功能强大 体积庞大 最年轻的
cat –n 显示行号
-A --show-all 显示非打印字符
-T 显示制表符
不带参数 默认从键盘读取内容
cat /etc/shells
显示可用的shell的种类
切换shell 输入名字即可 eg:ksh
其他shell返回bash shell 的时候一般先exit
不然会在当前进程下再创建一个子进程,会浪费资源
变量:(容器) 命名的内存空间
变量就是以一组文字或者符号等,来取代一些设定或者是一串保留的数据。
在脚本语言里,任何一种类型都会被识别为字符型
bash:本地变量 只对当前程序有效(类似于局部变量)
环境变量 shell中其他进程可以使用 共享型变量
export CLASS=3 导出变量值 可以被一个进程和子进程共用
unset NAME 撤销变量值
只有在引用(取变量的值)的时候加$
位置参数变量
特殊变量 $?
本地变量的声明:NAME=linna
或者 set CLASS=3
unset 取消变量值
引用:取变量值 “ ”,’ ’, ``
“ ” 弱引用 会做变量替换
‘ ’ 强引用 不会做变量替换
``(反引号) 命令引用 反引号内的命令会先执行,执行完的信息在传回到外部命令来处理。
通配符与特殊符号:
printf 不会自动在后面加”\n” 不会自动换行
{} 告诉变量名的范围 echo ${NAME}s 在name变量后边再加上s输出
命令引用:
FILE=`ls /root`
FILE=$(ls /var)
把命令的执行结果当做变量的值赋给FILE
声明的变量不想被人撤销或者改变 使用readonly命令声明
eg :readonly NAME
几点规则:——《鸟哥的linux私房菜》
1.变量与变量内容以等号来连接;
2.等号两边不能直接接空格符;
3.变量名称只能是英文字母和数字,但是数字不能是开头字符;
4.若有空格符可以用双引号或者单引号将变量内容结合起来,但要注意,双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符仅为一般字符;
5.必要时需要以转义字符“\”将特殊符号变为一般符号;
6.在一串命令中,还需要用到其他命令提供的信息,可以使用 `command` 注意是反引号
env 显示本地环境变量 通常用来保证运行一个命令的时候只在定制的路径下的命令
eg:env PATH=/bin/ls
不带任何参数也可以显示环境变量。
几个常用变量
PS1 export PS1=‘[\u@\h \W]$’
PS2
PS3
PS4
LANG 定义语言
locale 查看定义的语言区
LOGNAME
OLDPWD 记录上一个工作目录
SHELL
RANDOM 随机数,使用echo RANDOM时会产生一个随机数,介于0——32767之间。
如果想输出一个0——9之间的随机数,可以这样:
echo $? 返回上一个命令的执行状态值 eg 0 2 127
declare 声明变量类型
-a 将变量声明为数组(array)
-i 将变量声明为整数数字(integer)
-x =export 将变量声明为环境变量
-r 将变量声明为只读(readonly)
alias 定义命令别名
alias cdnet=’cd etc/sysconfig/network-scripts’
不想使用别名,在别名前加”\” .
unalias 撤销 仅对当前shell生效
登录信息显示数据 /etc/issue
/etc/motd 用户登录后显示信息
永久使用 编辑环境配置文件
#!/bin/bash
脚本中调试功能 set –x
set +x
之间的命令
bash –x 脚本名称 调试整个脚本
系统级别:全局/etc/profile , /etc/profile.d/* , /etc/bashrc
用户定义:~/.bash_profile , ~/.bashrc , ~/.bash_history , ~/.bash_logout
交互式 profile 通常用于放置环境变量的设置定义等
/etc/profile---à /etc/profile.d/*---à~/.bash_profile---à~/,bashrc---à/etc/bashrc
后面的会覆盖前边的
非交互式 bashrc别名等的定义
~/.bashrc---à/etc/bashrc----à/etc/profile..d/*
退出之前需要做些清理工作 ~/.bash_logout
使设置的别名生效 source 或者. 别名
lecture 7 标准I/O及管道
程序 <代码 数据>
总线 BUS ,PCI, ISA,EISA,AGP,USB
文件句柄 handle ,文件描述符
标准输入 keyboard 0
标准输出 monitor 1
标准错误输出 monitor 2 跟正常输出不是同一个数据流
I/O重定向:
>输出重定向 set –C (?---->set +C)拒绝别人信息的覆盖
如果一定要覆盖:> | 强行覆盖
<输入重定向
>>追加重定向 不会覆盖原有文件
<< here document 可以在脚本中生成文件
2>&1 === &> 标准错误输出重定向
管道
管道的最后一个命令是在一个子shell 中运行的
例子: echo ‘abcd’ | tr ‘a-z’ ‘A-Z’
tee
echo ‘abcd’ | tee /tmp/tee.out |tr ‘a-z’ ‘A-Z’
自定义文件描述符 exec 3> /tmp/custom.out
取消文件描述符 exec 3>&-
多次往一个文件中写入内容,可以提高脚本输出地效率,因为只需打开一次,关闭一次
lecture 8
less
more
tail -f 一直查看,命令不会退出
less
grep 全面搜索正则表达式 并打印出来
pattern 模式,从文件中匹配整个模式 而后显示包含了匹配到的内容的行
正则表达式 基本表达 扩展正则表达
* 次数匹配 匹配前边字符0次或任意次
.匹配任意单个字符
.*匹配任意字符0次或者任意次(任意长度任意字符)
?零次或一次
+ 一到任意次
默认处于贪婪模式,越长越好
r.\{2\} 只能出现两次
r.\{0,2\}出现0到2次
r.\{2,\ } 至少两次
[a-z] [A-Z] 匹配任一个字符
[^a-z]除了a到z
锚定符:
^root 以root开始
root$ 以root结尾
\<锚定单词词首
\>锚定单词词尾
\b 匹配词首词尾 \broot\b
\<root\> 只寻找含有root的字符
[abc] 匹配中括号中单个字符,
\(..\) love your lover \(love).*\1r
^[[:alpha:]]*[^.][0-9]*
寻找精度为2的小数
\<\[0-9]\{1,\}.[0-9]\{2\}\>
总结:
* 0<=
? 0 ,1
+ 1<=
| 或者
grep 全面搜索正则表达式 并打印出来
–v 反向显示 匹配到的不显示 而不匹配到的显示
-i 忽略大小写
-n 在匹配到的结果里只挑取有限范围行
-An 每一个匹配的行下边再显示N行
-Cn 每一个匹配的行上下边再显示N行
-E 使用扩展正则表达式
--color=auto 自动添加默认颜色
export GREP_COLOR=’01;32’ 改变显示颜色
grep –v “^$” ($以空白开头 以空白结束)把空白行去掉
egrep 使用扩展正则表达式
fgrep 快速搜索正则表达式 = grep –f 不做任何正则表达式的匹配,不把任何字符当做元字符
如何从一个文档中找出正确的ip地址
1[0-9]\{0,2\}|2[0-5]\{2\}\.[0-1]\{1\}[0-9]\{0,2\}|2[0-5]\{0,2\}\.[0-1]\{1\}[0-9]\{0,2\}|2[0-5] \{0,2\}\.[0-1]\{1\}[0-9]\{0,2\}|2[0-5] \{0,2\}
sort –o 指定保存在什么文件里边
-r 逆序
-n 以数值来排序
-u 把相同的行给去了
-t 指定以列排序
-k 指定第几段
-f 忽略大小写的差异
-b 忽略最前面的空格符部分
uniq 去除重复的行 假设两行一摸一样且连续
-c 显示每一行重复的次数
-u 只显示不重复的行
-d 只显示重复的
-i 忽略大小写
cut –d: 后面接分隔符。与-f 一起使用
-f 依据-d 的分隔字符将一段信息分割成数段,用-f 取出第几段
-c 以字符(character)的单位取出固定字符区间
ifconfig | grep “inet addr” | cut –d: –f2
wc word count 计算字符
-l 仅列出行
-w 仅列出多少字(英文单字)
-m 多少字符
who | grep“^root”|wc –l
写一个脚本显示某用户登录了多少次 以及登录时间
/dev/null 垃圾桶 把命令丢弃
条件测试 test express
0真 1假
&& 前面条件为真,后面一定会执行
前面条件为假,后面一定不执行
|| 前面条件为假,后面一定会执行
前面条件为真,后面一定不执行
grep “^root” /etc/passwd || (who | grep “^root” |wc -l)
grep “^roooot” /etc/passwd &&(who | grep “^root” |wc -l)
grep “^roooot” /etc/passwd &> /dev/null && (who | grep “^root” |wc -l)
grep “^roooot” /etc/passwd &> /dev/null || echo “Hello,world”
条件判断三种表达方式:
test expression #test 1 –gt 2
[expression] #[ 1 –gt 2]
`expression` #[[ 1 –gt 2]]
-a 与
-o 或
! 非
短路操作符
&&
[]&&[]只要前面为假,后边就不再运行
[]||[]
[2 –gt 3] || echo “3 is max”
cut -d: -f1 /etc/passwd | grep “^student$” && echo “Student exists” || echo “student is exists”
比较两个数大小
#!/bin/bash
[ $1 –gt $2 ]&& echo $1 || echo $2
条件测试分为三种:
整数测试
-gt -lt -ge -le -eq -ne
(($A>$B))
> >=
字符串测试
= != > < -z -n
文件测试
-e FILE
-f FILE
-d FILE
-r FILE
-w FILE
-x FILE
-L/-h FILE 测试一个文件是否为符号链接文件(软链接)
-O FILE 测试此文件属主是否是你自己
-G FILE
测试文件存在否 不存在就创建
diff/patch 比较两个文件的不同不同之处
diff vimrc virmc2 > vimrc.patch 生成一个补丁
patch vimrc <virmrc.patch 打补丁
diff virmc virmc2 比较
-u 用统一格式输出两个文件的不同
diff dir1 dir2 目录下同名的文件逐一比较
-p2
aspell 词法检查
tr ‘a-z’ ‘A-Z’ 字符转换
sed stream editor 行编辑器 一次只处理一行
非交互编辑器
没有破坏性 不修改源文件 除非使用shell的重定向
sed (stream editor) 流编辑器
sed是一个行编辑器,它逐行处理要被处理对象文件的内容,并会把结果输送至屏幕
sed [options] ‘patitern/operation’ File
‘/root(模式)/p(操作结果)’/etc/passswd
-n 不显示模式空间的内容,只显示匹配并处理的内容
sed s/(模式)/ROOT(模式/
默认只替换每行中第一个 全部替换使用选项-g
i 忽略大小写
分隔符可以使用任意你想要的符号 :s@@@
指定地址范围 add1,add2s/// /root/,/student/ s/root/ROOT/第一个出现root的行,第一个出现student的行
10,$(最后一行)s/root/ROOT/g
-i对原文件进行直接替换 默认不会改变原文件
-e 同时实现多项修改
-f 可以从文件中读取条件的选项
sed.txt的内容
-s 查找并替换
-a 在某行的后面进行追加
后面的“g”表示全局替换 global
1,5表示指定地址范围
operation p 显示
d 打印
vi 模式化编辑器
命令模式(编辑模式)
输入模式
末行模式
命令——>输入 i,a
输入——>命令 ESC
命令——>末行 输入冒号
末行——>命令 Esc (敲两下)
vi vi improved, vim
退出:
:wq 保存退出
:q 退出
:q!修改后不保存直接退出
:w!强制写入
shift+z 连输两次,保存退出
打开后光标处于第N行上 vim +n file
直接匹配到有redhat的哪一行 vim +/redhat file
光标移动:h 左 j下 k上 l右
行内移动:^第一个非空白字符的行首 0绝对行首 $绝对行尾
以单词为单位:w 一次移动一个单词(word)到下一个单词的词首 b (backward)上一个单词的词首,或当前单词的词首 e (end )跳到当前或下一个单词词尾
行间移动:nG 1G 跳到第一行
G 跳到最后一行
末行模式下实现行间跳转 :n
句间跳转: )(
段落间跳转: }{
命令模式——>输入模式:i:insert在当前光标所在处插入
I:在当前光标的行首
a:append 追加 在当前光标的后边插入 A在当前光标的行尾
o:在当前光标所在行上方插入新行
O:在当前光标所在行下方插入新行
cw 先删除一些东西,在转换到插入状态
c$
C
r (replace)字符替换
R (替换模式)所有操作都会替换原来的内容
删除 x 删除当前光标所在处(往后)的字符
X 删除光标往前的内容
d 连敲两次,用于删除 光标当前所在行
nd 用于删除光标下n行
复制操作
yy 复制一行 p粘贴
Y=yy
3yy 复制三行
p当前光标所在行的下方粘贴
P当前光标所在行的上方粘贴
移动内容
:,. +100
可视模式
v
V
查询:
/pattern
?pattern
\$[A-Z]\{1,\}
查找并替换:
:addr1,addr2s///gi
%全文搜索
:%s/red/RED/gi
:%s/^#//g
%s/^[[:space:]]\{0,\}#[[:space:]]*//g
%s/^[[:space:]]\{0,\}#[[:space:]]*.*$//g
ctrl + r 撤销上一次操作
redo 重做 不能重做撤销 ,一般是撤销之前的命令
一次打开多个文件
vim a b c d
:next 下一个
:prev 前一个
:first 第一个
:last 最后一个
-o 水平分割当前窗口
-O 用于垂直分割窗口
末行模式下 vsplit
set 定制vi编辑器
number:行号
autoindent 自动缩进
ignorecase忽略大小写
vimtutor vim练习器
shell算术运算:
$((expression))
$[expression]
let
面向对象:顺序 选择 循环