第二十二讲——vim文本编辑器 打开文件: Vim +12 filename 打开文件后,光标出现在第十二行的第一个字符 Vim + filename 打开文件后,光标处于整个文件的尾部。 Vim +/pattern(正则) 打开文件,定位至第一次被模式匹配的行首 关闭文件: 编辑模式(命令模式),删除,复制 输入模式,敲击动作录入到屏幕 末行模式,在屏幕下方可以键入命令,用于管理文件。 进入vim时,默认是编辑模式 i 当前光标所在字符之前插入数据。 a 在当前光标所在字符之后插入数据 o 在光标所在行的下方新建一行并转为输入模式 I 在当前光标所在行首插入数据 A 在当前光标所在行尾插入数据 O 在当前行的上方新建一行并插入数据 ESC 退出输入模式,还原为编辑模式 末行模式,必须从编辑模式下键入冒号 :10-20d 删除第10-20行 :w 保存文件,只读文件保存不了,管理员除外。 :q 不保存退出文件 :wq 保存并退出 :q! 强行退出(不保存) 末行模式-编辑模式 esc Vim中移动光标(快速定位) 一 逐字符移动光标 H左 J下 K上 L右 使用数字加上上下左右,可以一次性移动N个字符 二 以单词为单位移动 w: 移至下一个单词的词首 e: 跳至当前或者下一个单词的词尾 b: 跳至当前或者上一个单词的词首 三 行内跳转 数字0:跳到绝对行首 ^: 表示第一个非空白字符的行首 $: 跳至行尾,绝对行尾。 四 行间跳转 ( 或者 ) 在句子(语句间跳转) { 或者 } 在段落间跳转 #G 跳转至第#行 G 跳至最后一行 在末行模式下也可以实现跳转,给出行号,回车即可。 五 翻屏操作(编辑模式) Ctrl + F 向下翻一屏 Ctrl + B 向上翻一屏 Ctrl + D 向下翻半屏 Ctrl + U 向上翻半屏 六 删除单个字符 X:删除光标所在处单个字符 #x: 删除光标所在处及向后的N个字符 七 删除命令 d: 与行内跳转命令组合删除 d:告诉vim编辑器有删除动作。 dd: 删除光标所在行 #dd: 向下删除含光标所在行的n行 在末行模式下可以使用 startADD,endADD d 删除从start开始end结束的行。 相对表示法: .,+6d 从当前行向下删除6行 $ 表示最后一行 + 向下的n行 $-10 倒数第10行 刚刚删除的内容可以粘贴到其他地方(剪切) 八 粘贴命令 大写P:粘贴至上一行(粘贴复制为整行) 小写p:粘贴至下一行(粘贴复制为整行) 复制或者删除的为非整行时, 小写p:粘贴至当前光标的后方 大写P:粘贴至当前光标的前方 九 复制命令y y 告诉vim编辑器进行复制操作 yy 复制以整行 #yy 复制光标所在行开始向下的n行 十 先删除内容在转换为输入模式(修改) c: change 用法同d命令 cc 清空当前行,在转入输入模式 十一 替换 r :替换单个字符 R:转换为替换模式,通过输入覆盖 ESC退出替换模式。 十二 撤销编辑操作(编辑模式) u 撤销前一次的编辑操作,可以连续撤销 vim 至在缓存中保留最近50次的操作。 Ctrl+r: 撤销刚才的撤销操作。 十三 重复此前的操作 “ . ”重复上一次的编辑操作 十四 可视化模式 v/V 进入可视化操作,可以选中光标经过的字符。 v: 按字符选取 V:按矩形块选取。 十五 查找,支持正则表达式。 /pattern模式,从光标向下查找 ?pattren 模式,从光标出向上查找 n: 向下跳转 N:向上跳转 十六 查找并替换(末行模式下) 同sed命令 :startadd,endadd s@pattren@string@@gi i: 忽略字符的大小写 g: 全局替换 1,$ 全文 % vim中的全文指定 十七 使用vim编辑多个文件命令 Vim filename1 filename2 filename3 filename4 如果打开的文件默认是第一个,则可以在末行模式下输入 next: 切换至下一个文件 prev:切换至上一个文件 last: 切换至最后一个文件 first: 切换至第一个文件 q:只能退出当前文件 qa:退出所有文件 十八 分屏显示(窗口拆分) Ctrl+w,s 水平拆分窗口 Ctrl+w,v 垂直拆分窗口 窗口间切换 Ctrl+w 上下左右切换 q:退出当前窗口 qa:退出所有窗口 十九 分窗口显示(多个窗口) Vim -o小写 水平显示窗口 Vim -O大写 垂直显示窗口 二十 将当前文件的部分内容存为另一个文件 末行模式下的w命令 :w 保存为当前文件 :w /path/to/filename 将文件另存为 :startadd,Endaddw /path/to/filename将指定内容另存为 二十一 将另外一个文件的内容附加在当前内容中 :r /path/to 在当前光标后附加一个文件的内容 二十二 跟shell交换(末行模式) :!command 输入shell中的命令 二十三 高级话题 显示、取消行号 Set nu set nonu 行号不是文件的组成部分,只显示当前进程有效 忽略或区分大小写 set ic(ignorecase) set noic 设置自动缩进 Set ai/autoindent set noai 查找到的文本高亮显示 Set hlsearch set nohlserch 语法高亮(语法着色) Syntax on 开启语法高亮 Syntax off 关闭语法高亮 只对当前的vim进程有效,永久 有效需要写入/etc/vimrc ~/.vimrc配置文件。 Vim配置文件 Vim的全局配置文件 /etc/vimrc 对所有用户生效 Vim的用户配置文件,仅对用户生效 ~/.vimrc 影藏文件,如果没有自己创建 当vim在正常编辑的情况下意外退出,会在文件所在目录下生成一个隐藏的swp文件,这时打开文件会有报错信息,可以从中恢复编辑过的内容。 顺便复习一下几个测试表达式的条件所有是在[ ]中括号内进行测试 整数测试: -le -ge -eq -lt -gt 字符测试: == != > < -n测试字符串是否为空 -s字符串是否不空 string 是否不空 文件测试: -d目录 -f文件 -e是否存在 -r是否可读 -w是否可写 -x是否可执行 组合测试: -a 与关系 -o或关系 !非关系 If [ $# -gt 1 –a $# -lt 3 ]等价于if [ $# -gt 1 ] && [$# -lt 3 ] 给自己讲linux 2016-12-22 评论 1603 次浏览
第二十一讲——sed流处理 Sed:stream editor。流编辑器(文本编辑器) Sed是一个行编辑器,是逐行进行处理的 编辑器: 行编辑器 sed 全屏编辑器 vim Sed命令bin不是直接对文本进行处理,而是逐行将文件数据读取到内存中去,而后从内存中完成编辑,并将编辑后的数据输出到屏幕上来,这个内存空间我们称为模式空间(对sed而言)。 因为sed处理文本也不是每一行都处理的,或者说,sed也可以指定仅处理那些行。而这些行也可以像grep那样做模式过滤,符合模式的处理,不符合的不处理,处理结束后将模式空间的内容打印至屏幕。Sed本身也是一种语言,仅对文本做编辑。 sed [option] {script sed 脚本 } [input file] sed ‘adresscommand’ file……(文件可以有多个) 地址 命令 连写,中间无空格 符合adress的行执行以下的命令 Command: d 删除符合条件的行(显示不匹配的行,默认全部输出) p 打印符合条件的行,p命令是特殊命令的处理结果,符合条件打印,而sed默认会将模式空间中的内容打印,所以匹配的行会打印两遍。 -n 只打印符合条件的行(默认全部输出) a\”string” 在指定的行后面追加新行(匹配行的下一行),内容为string \n 换行,可在匹配行后添加新行 i\string 在指定行的前面添加新行,内容为string r filedir 将指定文件中的内容添加至符合条件的行处,只要有符合的行就执行,并非只执行一次。 w filename 将指定范围内的内容另存至指定的文件中。 s 查找并替换,s/模式/替换的内容/g|i 模式(parttern),可使用正则 s默认是匹配每一行的第一个,末尾加修饰符 g(全局替换,整行替换) i(查找时忽略大小写) 分隔符可以是///,也可以是###,还可以是@@@等等可以再特殊查找下避免混淆。 Sed 中可以使用后向引用,使用转义后的括号分组,然后引用括号内的内容。 Sed ‘@\(string\)@\1@g’ 在查找替换中,引用模式匹配的整个串使用 & 字符,引用前面匹配的字符串。 -n 静默模式,不再提示模式空间中的内容。 -i 直接修改源文件,这是个很危险的操作。 -f 指定一个sed脚本。 -e script -e script 可以执行多个sed命令 -r 使sed支持扩展的正则表达式,sed默认只支持基本的正则表达式。 使用sed’命令提取文件/目录的父目录: echo /passwd/1/2/3/4/5 |sed -r ‘s@^(/.*/)[^/]+/?@\1@g’ id命令: id –n –u 用户的用户名username id –n –g 用户的组名 groupname bc计算器: bc命令进入计算界面 scale=2 保留两位精度 可以使用echo “scal=2;10/2” |bc 使用echo命令将参数送入bc计算器 还可以使用 bc <<< “scal=2;100/3” 类似于输入重定向。 For循环 for 变量 in 列表 do 循环体 done 列表为一大堆数,for语句会对这一堆数进行遍历。 {1..100} 整数列表,1-100的整数 seq命令 seq 起始数 步进长度 结束数 结束数未必是列表中一定出现的,因步进长度而定。 起始数为1,步进长度为1时可以省略 Bash不支持浮点运算。 declare –i sum 声明一个整数变量 declare –x 变量 声明一个变量为环境变量 类似于export 在shell中键入export env printenv 都可以打印当前环境的变量声明。 给自己讲linux 2016-12-21 评论 1655 次浏览
第二十讲——条件测试类型 条件测试类型有三类: 整数测试 字符测试 文件测试 整数测试:双目操作符 -eq 测试两个整数是否相等 -nq 测试两个整数是否不等 -gt 测试一个数是否大于另一个数 -lt 测试一个数是否小于另一个数 -ge 测试一个数是否大于等于另一个数 -le 测试一个数是否小于等于另一个数 使用方法有两种(条件测试的表达式) 一是 test expression 例如:test $n –ge $m 二是使用中括号: [ expression ]中括号与测试语句间有空格 If [ $UID –eq 0 ] 等价于if [ `id –u username` -eq 0 ] 后者引用了命令的执行结果 If id username ; then 判定用户是否存在,这是一个执行的状态返回值 如果我们要取一个命令的状态执行结果,不能加引号,要么直接调用,要么让命令先执行,然后取$?的值。 Exit 退出当前进程,用于定义撞他返回结果(定义状态码),如果exit后不跟数值,则将前一条命令的状态返回值作为整个脚本的状态返回值。 文件测试: -e filename 测试文件是否存在 -f filename 测试是否为普通文件 -d filename 测试指定路径是否为目录 -r filename 测试对当前执行脚本的用户是否有读权限 -w filename 测试对当前执行脚本的用户是否有写权限 -x filename 测试当前执行脚本的用户是否有执行权限 -s filename 测试是否为空文件 变量测试:字符的大小比较是无意义的 [ $str1 == $str2 ] 测试两个字符串是否相等 [ $str1 != $str2 ] 测试两个字符串是否不等 [ $str1 ] 测试字符串是否不空 [ -s $str1 ] 测试字符串是否不空 [ -n $str1 ] 测试字符串是否为空 在这里顺便啰嗦一下bash中的语句逻辑关系 逻辑与 && 当第一个条件为真时,第二个条件必须判断 逻辑或 || 当第一个条件为假时第二个条件必须判断 逻辑非 ! 逻辑符又称为短路操作符,只要有一个条件满足,则后面的都不执行。 Shell下的算术运算 let命令 a=1 b=2 let c=$a+$b $[算术运算符表达式] $((算数运算符表达式)) expr 算数运算表达式各操作数和运算符之间要有空格。 C=`expr $a + $b` 顺便再复习一下系统变量, 环境变量:export 作用域为当前shell及其子shell 本地变量:作用域为当前shell 局部变量:作用域为代码段 位置变量:$!,$2.$3以及后向引用中的\1,\2,\3等等 特殊变量:$? 上一条命令执行的状态返回值 $# 脚本中引用参数的个数 $0 脚本名称 $1 第一个参数 $2 第二个参数,最多有9个 给自己讲linux 2016-12-20 评论 1604 次浏览
第十九讲——IP地址和杂谈 说起IP地址,想来大家都不会陌生,因为在家里通过无线路由器上网都是需要无线路由器给手机或者电脑分配IP地址一般来说是从192.168.0.1-192.168.255.255,这些路由器都是支持DHCP服务,即自动分配、回收IP,所以我们只需要知道登录到无线路由器就可以连接互联网。 我们现在使用的是IPV4协议,不过现在IPV6也已经开始铺开了,就IPV4来说,共分为五类A、B、C、D、E 我们能够使用的就是A、B、C三类,IP地址第一位不能为0,最后一位也不能为0 A:1-127 B:128-191 C:192-233 D、E网段用于研究 我们使用正则表达式提取ifconfig中的IP地址,使用grep命令,如果仅仅是提取某个网卡的IP地址还需要使用到-A命令,即匹配网卡名称下#行。 Ifconfig |egrep ‘\<([1-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]\>\.){3}\<[1-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]\>’ . 在正则中有特殊意义需要转义,使用{m,n}缩短书写。 fgrep ----fast grep 快速的匹配,但是不支持正则表达式,执行速度快 shell编程: shell编程通俗的说就是写脚本,但是再说shell编程之前饿哦们先了解一下编程语言 简单地说,编程语言按人类易懂的方式可以分为第低级语言和高级语言,低级是指更接近硬件,高级指的是更接近人类语言,低级语言的执行效率更高,但是更难编写,高级语言相对容易,但是执行效率低下。 在高级语言中可以分为 静态语言:静态语言通常为强类型语言(变量类型),执行时事先需要转换成可执行的格式,所以静态语言也是编译型语言,有完整的程序开发环境,由编译器直接编译成二进制文件,这类语言有C、C++、C#、JAVA等等 动态语言:解释型语言,边解释边执行,on the fly(运行过程中转换),如PHP、shell、Python,动态语言通常是弱类型语言(可以不用声明变量,直接使用)。 但是解释器本身是由静态语言开发的。 说完了语言的动静分类,还有一种分类方式:面向对象和面向过程。 面向过程:把编程的着眼点、立足点主要放在解决问题过程本身。如shell、c等等 面向对象:把整个我们要实现的项目抽象成一个个的对象,并定义对象之间的动作,就是可发出的操作来完成的,面向对象更适合开发大型程序。如JAVA、Python、perl、C++等等 面向过程和面向对象是两个不同的变成风格。 对于程序来说:变量是一个不可或缺的东西 变量:内存空间 变量名:用于引用内存空间,变量名会映射为内存地址。 变量使用完后还可以进行回收,为了确定数据的存储格式,所以有了变量类型的概念,即整型,长整型、字符型等等。 变量的类型:用于确定数据的存储格式和数据的长度。字符型、数值型、整型、浮点型。变量一定是某一进程的变量 例如时间的存储:2018-01-10,按字符存储需要64位,一个字符占一个字节,不算符号,但是按照时间戳(数值大小)存储,2^24次方(24位,三个字节),所以说按不同类型存储占用的空间也会不一样,当攻击者特意的制造一个数据使缓冲区溢出,缓冲区溢出是网络攻击中很严重的行为,避免的方法就是对输入所谓数据进行判断是否溢出。 有解释器的语言,也就是通常说的脚本语言,如果变量不符合法则,可以由解释器在另一个层次上避免,所以变量类型都是弱类型的。 布尔类型:只有真和假。 逻辑运算:与或非、异或 强类型的语言在使用变量前必须先进行声明,甚至还需要初始化,如果不初始化则内存中的随机数会对其进行干扰,一般来说数值初始为0,字符串初始为空(null) 当我们进行计算时1+1属于显式转换,1+c c会转换成相应的ASCII码的数值,在不同的语言中赋值的方式也可能不同 Bash变量的类型: 环境变量:作用域为当前shell进程及其子进程。 本地变量(局部变量),局部变量未必就是本地变量 本地变量:整个bash进程都有效 局部变量:只对当前代码段有效。 位置变量:grep或者sed中的后向引用属于位置变量$1,$2,$3等也属于位置变量,用于引用脚本的参数。 特殊变量:bash中内置保存某些特殊数据的变量(系统变量),保存有特殊数据,$?:保存上一个进程(命令)执行状态的返回值。程序执行时可能有两类返回值1是程序的执行结果,2是程序状态返回结果(0-255),0表示为正确运行1-255表示错误的不同,1/2/127为系统预留 Shell中变量的引用${},大多数情况下大括号是可以省略的,当遇到Animal=pig 需要输出pigs时 echo “there are some ${Animal}s” 脚本在执行的时候会执行一个子shell进程,所以当前shell的环境变量对于子shell是有效的(命令行启动的脚本会继承当前shell的环境变量) 如果是系统自动执行的脚本(非命令行启动的脚本),需要定义需要的个环境变量。 环境变量的声明:可以直接声明并定义 export name=China 也可以先定义后声明 name=China export name 向变量中追加字符:city=bazhong city=‘$city:dazhou’可完成追加 对于shell来说,默认所有的字符都是字符串,所以默认是不能进行算术运算的。 变量使用结束后需要释放,否则会占用空间,设置变量时使用set,释放变量使用unset。 Set命令可以查看系统所有的变量 查看当前shell中的环境变量 Printenv env export 特殊变量和位置变量无法查看。 对我们而言脚本就是一种命令的堆砌,按照实际需求结合流程控制语句实现的程序,我们称为脚本。 Shebang:魔数,以#!开头加上解释器的路径,内核会根据shebang所指定的路径调用解释器执行脚本除了第一行的#!,其他行出现失误#号都是注释行。 当脚本执行结束变量就会撤销。 执行一个脚本的方式: 将当前目录加入PATH,就可以当做命令来执行 直接指定路径也可以执行./指定为当前目录。 bash 1.sh 1.sh作为参数来运行,并不是作为脚本执行。 变量名只能包含字母数字和下划线,并且不能以数字开头,不应该和已有的环境变量重名,否则会覆盖掉环境变量的值,还要做到见名知意。 给自己讲linux 2016-12-19 评论 1674 次浏览
第十八讲——正则表达式 正则表达式:pattern(模式),由字符和正则表达式的元字符组合起来过滤文本的过滤条件。 正则表达式分为两类: 基本正则表达式 Basic REGEXP 扩展的正则表达式 Extend REGEXP 它们所支持的元字符有一部分是不一样的,甚至相同的元字符意义也不尽相同。 大多数的文本类处理命令都支持正则表达式,而且正则表达式是使得计算机变得智能化的一个重要途径。 掌握正则表达式对我们来讲,是我么处理文本的基本常识 默认情况下,我们的正则表达式工作在贪婪模式下。 基本正则表达式(basic REGEXP): 字符匹配: . (点)任意的单个字符 [] (中括号)指定范围内的任意单个字符 [^](中括号内部加上托字符)指定范围外的任意单个字符 次数匹配: (*) (星号)匹配前面的字符任意多次(零次或者多次) \? (转义后的问号)匹配前面的字符零次或一次 \{m,n\} (转义后的大括号) 匹配前面的字符至少m次,至多n次 .* 表示任意长度的任意字符 锚定: ^ 锚定行首(之后的字符) $ 锚定行尾(之前的字符) \<,\b 锚定单词首部 \>,\b 锚定单词尾部 \( \) 转义后的小括号用于实现分组(后向引用) 如sed中的sed ‘s/\(.*\):bash$/\1/g’ 实现后向引用,\1\2\3等等。 扩展正则表达式: 字符匹配: . 任意单个字符 [] 指定范围内的任意单个字符 [ ^] 指定范围外的任意单个字符 次数匹配: (*)匹配前面的字符任意次 ? 匹配其前面的字符零次或者一次 + 匹配前面的字符至少一次 () 括号,实现真正意义上的分组,实现后向引用\1,\2,\3 {m,n} 匹配其前的字符至少m次,至多n次 \<,\b 锚定行首(之前的字符) \>,\b 锚定行尾(之后的字符) $ 锚定行尾 ^ 锚定行首 | 或者 or c|cat 匹配c或者cat 例如:查找1-255之间的整数 分别锚定 egrep \<[1-9]\>|\<[1-9][0-9]\>|\<[1[0-9][0-9]\>|\<[2[0-4][0-9]\>|\<25[0-5]\>’ /boot/grub/grub.conf 整体锚定 grep –E ‘\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>’ /boot/grub/grub.conf grep默认仅支持基本正则表达式定义的模式来过滤文本的命令 -i 忽略大小写 -v 输出不匹配的行 -o 显示匹配的字符串 --color 支持匹配字符串高亮显示 -E 支持扩展正则表达式 -A #显示匹配行下的#行 -B #显示匹配行上的#行 -C #显示匹配行上下的#行 context 上下文 给自己讲linux 2016-12-18 评论 1685 次浏览
第十七讲——关于重定向和管道 我们先回顾一下计算机的五大基本组件 1.运算器 2.控制器 运算器和控制器是cpu的一部分 3.存储器 RAM易失性存储器 4.输入设备 5.输出设备 寄存器是CPU内部的临时存储器 程序是由指令和数据组成 三大总线 1.地址总线:用于实现内存的寻址 2.数据总线:用于传输数据 3.控制总线: 用于试下控制指令 实际上在机器上总线是复用的,即一根总线三种功能。 重定向: 我们能够同计算机产生交互,并且让计算机反馈回我们需要的信息,这是怎么做到的?这个就与输入输出设备相关。 常见的输入输出设备有很多,如果一个程序没有指定输入或者输出设备,系统为了统一调度,会提供默认的输入输出设备 标准输入 STDIN 0(描述符) 默认为键盘 标准输出 STDOUT 1(描述符) 默认为显示器 标准错误输出 STDERR 2(描述符) 默认为显示器 错误输出与标准输出是两个不同的数据流 改变数据输入输出叫做I/O重定向 > 输出重定向(覆盖原有内容) set -C 关闭重定向覆盖 set +C 开启重定向覆盖 >>追加重定向(在文件尾部追加) < 输入重定向 << Here document(此处生成文档) cat << EOF EOF为文档结束标记 end of file cat >> /tmp/test << EOF 等价于 cat << EOF >> /tmp/test(个人理解,如有错误请指正) 从标准输入向/tmp/test中追加内容 &>/dev/null 将正确和错误的全部丢掉。 管道: | echo “1234567890” |tee /tmp/test.sh tee 输出到屏幕并保存到/tmp/test,sh 从标准输入读取数据,输出到屏幕一份,保存到文件一份。 将echo的内容送给tee命令,就是管道的作用。 额……下一讲是比较绕来绕去的正则表达式。 给自己讲linux 2016-12-17 评论 1677 次浏览