本文共 32858 字,大约阅读时间需要 109 分钟。
alias(中文称为“别名”)允许使用更加简短的名称来重新定义 Linux 中的 Shell 命令,从而简化命令行的输入。
通常都是用bashrc来访别名和函数[root@centos7 ~]#cat .bash_profile .bash_profile Get the aliases and functions 获取别名和函数if [ -f ~/.bashrc ]; then (-f判断是否是不同文件, . ~/.bashrcfi User specific environment and startup programs 用户特定的环境和启动程序PATH=$PATH:$HOME/bin path路径export PATH 导出路径
单个用户永久生效是放在家目录里的配置文件.bashrc里,针对所有用户就需要放在etc/profile或者/etc/bahsrc里
[root@centos7 ~]#echo "alias lftps='lftp 172.168.0.1/pub'" >> /etc/bashrc 也可以是/etc/profile[root@centos7 ~]#. /etc/bashrc[root@centos7 ~]#aliasalias lftps='lftp 172.168.0.1/pub'
-v 显示没有匹配到的行
[root@centos7 ~]#grep "/bin/bash$" /etc/passwd root:x:0:0:root:/root:/bin/bashmemcachaed:x:2001:2001::/home/memcachaed:/bin/bashalice:x:2005:2005:alice2,lll,223333,12333:/home/alice:/bin/bashbob:x:2006:100::/home/bob:/bin/bashbash:x:2007:2007::/home/bash:/bin/bash[root@centos7 ~]#grep -v "/bin/bash$" /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync
grep 正则表达式
[root@centos6 ~]#grep -w "[[:digit:]]\{2,3\}" /etc/passwd 或者grep -w "[0-9]\{2,3\}" /etc/passwd 或者 grep "\<[0-9]\{2,3\}\b" /etc/passwd 或者 grep -Ew "[[:digit:]]{2,3}" /etc/passwdmail:x:8:12:mail:/var/spool/mail:/sbin/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologin
[root@centos6 ~]#grep "^[a-z]\|^[A-Z]" /proc/meminfo 或者 grep -e "^[a-z]" -e "^[A-Z]" /proc/meminfo 或者grep -e "^[[:upper:]]" -e "^[[:lower:]]" /data/test 或者 grep "^[[:upper:]]\|^[[:lower:]]" /data/test MemTotal: 2037260 kBMemFree: 1207672 kBBuffers: 113940 kBCached: 339768 kB扩展正则表达式[root@centos6 ~]#grep -E "^[[:upper:]]|^[[:lower:]]" /data/test 或者 grep -E "^([[:upper:]]|[[:lower:]])" /data/test HugePages_Total: 0HugePages_Free: 0
扩展正则表达式种 ^:行首;$行尾 ;<,\b,语首 ;>,\b:词尾, 绝对路径后面为一个单词就可以认为是一个单词的词首,所以如下:
[root@centos6 ~]#echo /etc/passwd/alice/bb |grep -Eo ".*\<" 但是\
[root@centos6 ~]#ifconfig |grep -Eo "inet addr:([0-9]{1,3}\.){3}([0-9]){1,3}"|grep -Eo "([0-9]{1,3}\.){3}([0-9]){1,3}" 192.168.30.6 127.0.0.1 [root@centos6 ~]#ifconfig |sed -rn "s/.*inet (addr:)?(([0-9]{1,3}\.){3}[0-9]) .*/\2/p" 192.168.30.6 127.0.0.1
127.0.0.1为巡回地址可以筛选出来,不做使用
vim配置文件全局:/etc/vimrc 个人:~/.vimrc
root@centos7 ~]#echo set tabstop=4 >> .vimrc 设置缩进为4个字符 [root@centos7 ~]#echo set ai >> .vimrc #设置自动缩减 [root@centos7 ~]#vim /etc/centos-release #查看效果CentOS Linux release 7.6.1810 (Core) ddd d;; ddd
#!/bin/bashfor i in {1..3} ; do read -p "Plsease input your username: " username if [ -z "$username" ] then { echo $username is empty;exit; } else useradd $username &> /dev/null && echo ok || echo The user$username was be created fi done user1id=" `getent passwd |cut -d: -f3 |tail -n3 `"echo "id count is `echo $user1id |tr " " +|bc `"[root@centos7 ~]#./createuser3.sh #执行效果Plsease input your username: rokPlsease input your username: tokPlsease input your username: yokid count is 6039
sysnopsis 简单概述
find是实时查找工具,通过遍历指定路径完成文件查找 工作特点: 1.查找速度略慢 2.精确查找 3.实时查找 4.可能只搜索用户具备读取和执行权限的目录 5.find占用性能比较大 语法: 1. find [option]…[查找路径][查找条件][处理动作] 2.查找路径:指定具体目标路径;默认为当前目录 3.查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件 4.处理动作:对符合条件的文件做操作,默认输出至屏幕 5.查找路径可以省略 默认为当前目录 6.默认就是把文件名打印出来 查找条件:指搜索层级
-maxdepth level 最大搜索目录深度,指定目录为第1级 -mindepth level 最小搜索目录深度
根据文件名和inode查找
-name "文件名称":支持使用glob(通配符) 默认是精确匹配 *,?,[],[^] -iname "文件名称":不区分字母大小写 -inum n 按inode(节点编号)号查找(ll -i 可以查看节点编号) -samefile name 相同inode号的文件 -links n 链接数为n的文件 -regex "PATTERN(模式)":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称 默认查找是递归的
根据属主、数组查找
-user USERNAME:查找属主为指定用户(UID)的文件 -group GRPNAME:查找属组为指定组(GID)的文件 -uid UserID:查找属主为指定的UID号的文件 -gid GroupID:查找属组为指定的GID号的文件 -nouser:查找没有属主的文件 -nogroup:查找没有数组的文件
根据文件类型查找
-type TYPE: f:普通文件 d:目录文件 l:符号链接文件 s:套接字文件 b:块设备文件 c:字符设备文件 p:管道文件
组合条件
与:-a 或:-o 非:-not,!
德摩根定律
(非A)或(非B)=非(A且B) !A -o !b =!(A -a B) (非A)且(非B)=非(A或B) !A -a !b =!(A -o B)
根据文件大小来查找
-size[+|-]#UNIT 常用单位:k,M,G,c(byte) #UNIT:(#-1,#] 如:6k 表示(5k,6k] 不包括5k,包括6k 5k<=6k -#UNIT:[0,#-1] 如:-6k 表示[0,5k] 包括0,包括5k 0<=x<=5k +#UNIT:(#,∞) 如:+6k 表示(6k,∞) 不包括6k,无穷大
根据时间戳查找
以"天"为单位; -atime [+|-]#, #:[#,#+1) +#:(#+1,∞) -#:[0,#) -mtime -ctime 以"分钟"为单位: -amin -mmin -cmin
根据权限查找
-perm[/|-]MODE MODE:精确权限匹配 /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+从centos7开始淘汰 -MODE:每一类对象都必须同时拥有指定权限,与关系 0表示不关注 / -的符号时,0代表不检查,-表示交集,/并集
find -perm 755 会匹配权限模式恰好是755的文件
只要当任意人有写权限时,find -perm +222就会匹配
只有当每个人都有写权限时,find -perm -222才会匹配
只有当其它人(other)有写权限时,find -perm -002才会匹配
find [option]…[查找路径][查找条件][处理动作]
处理动作
-print:默认的处理动作,显示至屏幕 -ls:类似于对查找到的文件执行"ls -l"命令 -delete:删除查找到的文件(一般不用,比较危险,没有提示信息) -fls file:查找到的所有文件的长格式信息保存至指定文件中(结果存到文件去) -ok COMMAND {}\;对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认({}代表前面find命令搜索出来的文件名;带ok选项 要后面加 \;语法需要) -exec COMMAND {}\;对查找到的每个文件执行由COMMAND指定的命令 {}:用于引用查找到的文件名称自身 find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令 **必须要\;结束**
{}有文件名称本身,有可能里面带路径、 -ok和exec都要加 ;
find示例
备份配置文件,添加.orig这个扩展名
fine -name “*conf” -exec cp {} {}.orig ;提示删除存在时间超过3天以上的joe的临时文件
find /tmp -ctime +3 -user joe -ok rm {} ;在主目录中寻找可被其它用户写入的文件,把写权限
find ~ -perm -002 -exec chmod o-w {} ;查找/data下的权限为644,后缀为sh的普通文件,增加执行权限
find /data -type f -perm 644 -name " (通配符).sh" -exec chmod 755 {} ;查看/home 的目录
find /home -type d -ls查找/var目录下属主为root,且属组为mail的所有文件
find /var -user “root” -a -group “mail” -ls查找/var目录下不属于root、lp、gdm的所有文件
find /var !( -user “root” -o -user “lp” -o -user “gdm” ) -l查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是pstfix的文件
find /var -a mtime 7 ! -user “root” -a ! -user “pstfix”查找当前系统当没有属主或属组,且最近一周内曾被访问的文件
find /var ! ( -nouser -a -nogroup ) -a -atime 7 -ls查找/etc目录下大于1M且类型为普通文件的所有文件
find /etc/ -type f -a -size +1M查找/etc目录下所有用户都没有写权限的文件
find /etc -perm 111 -o -perm 444 -ls查找/etc目录下至少有一类用户没有执行权限的文件
find /etc -perm /111 -ls查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
find /etc/init.d -perm 111 -a -perm 001 -lssysnopsis 简单概述
locate是非实时查找(数据库查找)查询系统上预建的文件索引数据库(/var/lib/mlocate/mlocate.db) 工作特点:依赖于实现构建的索引
索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据库(updatedb) 索引构建过程需要遍历整个根文件系统,极消耗资源。 查找速度快 模糊查找 非实时查找 搜索的是文件的全路径,不仅仅是文件名 可能只搜索用户具备读取和执行权限的目录常用的选项: -i 不区分大小写的搜索 -n N 只列举前N个匹配项目 -r 使用正则表达式 locate示例: 搜索名称或路径带有"conf"的文件 [root@centos7 ~]#locate conf/var/lib/yum/history/2018-12-24/7/config-repos/var/lib/yum/history/2018-12-24/8/config-main/var/lib/yum/history/2018-12-24/8/config-repos
使用扩展正则表达式来搜索以".conf"结尾的文件
[root@centos7 ~]#locate -r '\.conf$'/var/lib/NetworkManager/dhclient6-eth1.conf/var/lib/libvirt/dnsmasq/default.conf
由于很多命令不支持管道’|'来传递参数,而日常工作中有这个必要,所以就有了xargs命令
xargs用于产生某个命令的参数,xargs 可以读入stdin(标准输入)的数据,并且以空格符或回车符将stdin的数据分割成为arguments 注意:文件名或者是其他意义的名字内包含有空格符的情况 有些命令不能接受过多参数,命令执行可能会失败,xargs可以解决 find和xargs格式:find | xargs COMMAND xargs默认是把前面一个输出的信息用空格隔开 echo f{1…10} | xargs -n2 echo #-n2 2个一组 n表示一次传几个参数过去抽取文本的工具:
文件内容:less和cat 文件截取:head和tail 按列抽取:cut 按关键字抽取:grep 1.文件查看的命令:cat cat,tac,rev rev是一行反,tac是从头到尾反 cat语法: cat [option]…[file]… -E:显示行结束符 ( ( (是回车键) -n:对显示出的每一行进行编号 -A:显示所有控制符 -b:非空行编号 -s:压缩连续的空行成一行2.分页查看文件内容:more
more:分页查看文件 more语法: more [option…]file… -d:显示翻页及退出提示 less:一页一页地查看文件或STDIN输出 查看时用的命令包括: /文本 搜索 文本 n/N 跳到下一个或上一个匹配 less 命令是man命令使用的分页器 对于显示的信息过多,可以用less和more3.显示文本前或后行内容:head,tail
head语法: head [option]…[file]… -c #:指定获取前#字节 -n #:指定获取前#行 - #:指定行数 tail语法: tail [option]…[file]… -c #:指定获取前#字节 -n #:指定获取前#行 - #: - f:跟踪显示文件fd新追加的内容,常用日志监控,相当于–follow=descriptor - F:跟踪文件名,相当于—follow=name–reytry tail 类似 tail -f,当文件不增长时并不访问文件tail命令一般用在日志中,默认后 10行,因为日志都是追加的,查询最新的记录只要tail最后几行就可以了 tail -f 类似tailf 可以监听这个文件的变化
4.按列抽取文本cut和合并文件paste:
cut语法: tail [option]…[file]… -d DELIMITER:指明分隔符,默认tab -f FILEDS: #:第#个字段 #,#[,#]:离散的多个字段,例如1,3,6 #-#:连续的:连续的多个字段,例如1-6 混合使用:1-3,7 -c 按字符切割 --output-delimiter=STRING指定输出分隔符(delimiter 分隔符,域,列) find示例 显示文件或STDIN数据的指定列 cut -d: -f1 /etc/passwd cat /etc/passwd | cut -d: -f7**paste语法:** paste 合并两个文件同行号的列到一行 paste [option]...[file]... -d 分隔符:指定分隔符,默认用TAB -s:所有行合成一行显示 paste f1 f2 paste -s f1 f2 **cut可以把文件中特定列固定出来** **paste合并两个文件同一行的内容合并**
5.分析文本的工具:wc,sort,diff和patch
文本数据统计:wc 是word count字数计数 整理文本:sort 比较文件:diff和patch 收集文本统计数据wc: 计数单词总数、行总数、字节数和字符总数 可以对文件或STDIN中的数据运行 wc story.txt 39 237 1901 story.txt 行数 字数 字节数 wc命令选项: -l:只计数行数 -w:只计数单词总数 -c:只计数字节总数 -m:只计数字符总数 -L:显示文件中最长行的长度 文本排序sort: 把整理过的文本显示在STDOUT,不改变原始文件 sort语法: sort [option] file(s) sort常用命令选项: -r:执行反方向(由上至下)整理(倒序) -R:随机排序 -n:执行按数字大小整理 -f:选项忽略(fold)字符串中的字符大小写 -u:选项(独特,unique)删除输出中的重复行(去重) -t c:选项使用c做为字段界定符 -k x:选项按照使用c字符分隔的x列来整理能够使用多次 uniq: 从输出中删除前后相接的重复的行 uniq语法: uniq[option]…[file]… -c:显示每行重复出现的次数 -d:仅显示重复过的行 -u:仅显示不曾重复过的行 注意:连续且完全相同才为重复 重复是指相邻的重复,隔开的就不算重复 uniq默认是把相邻的重复行合并成一个 常和sort命令一起配合使用: sort abc.txt | uniq -c 比较文件:diff 比较两个文件之间的区别[root@centos7 /data]#cat >123.text112[root@centos7 /data]#cat >1234.text122[root@centos7 /data]#diff 1231234.text 123.text [root@centos7 /data]#diff 123.text 1234.text 2c2< 1---> 2 #第2行有变化
复制对文件改变:path
diff 命令的输出被保存在一种叫做"补丁"的文件中 使用 -u 选项来输出"统一的(unified)"diff格式文件,最适用于补丁文件 path 复制在其它文件中进行的改变(要谨慎使用) 使用 -b 选项来自动备份改变了的文件 diff -u foo.conf foo2.conf >foo.path path -b foo.conf foo.path 文本处理示例:1、找出ifconfig "网卡名"命令结果中的ipv4地址
ifconfig eth0 |grep -Eo “([0-9]+.){3}[0-9]”|head -n1 192.168.30.72、查出分区空间使用率的最大百分比值
df | tr -s ’ ’ | cut -d ’ ’ -f5 |sort -nr |head -n13、查出用户uid最大值的用户名、uid及shell类型
sort -nr /etc/passwd |head -n14、查出/tmp的权限,以数字方式显示
stat -c%a /tmp5、统计当前链接本机的每个远程主机ip的连接数,并按从大到小排序
cat -d’ ’ -f1 /var/log/httpd/access_log | uniq -c |sort -nr6.文本过滤(模式:pattern)工具:grep (Global search REgular expression and Print out the line)
fgrep不支持正则表达式 egrep支持扩展正则表达式 作用:文本搜索工具,根据用户指定的"模式"对目标文本逐行进行匹配检查;打印匹配到的行 模式:由正则表达式字符及文本字符所编写的过滤条件 grep语法: grep [options] pattern [file…] grep命令选项: --color=auto:对匹配到的文本着色显示 -v:显示不被pattern匹配到的行 -i:忽略字符大小写 -n:显示匹配的行号 -c:统计匹配的行数 -o:仅显示匹配到的字符串 -q:静默模式,不输入任何信息(静默就关心包含是否,而不关心包含的是什么 ,会存在返回结果,放在$?里会帮助我们判断前面的执行结果0找到,1不找到) -A #:after,后#行 -B #:before,前#行 -C #:context,前后各#行 -e:实现多个选项间的逻辑or关系 grep -e ‘cat’ -e ‘dog’ file -w:匹配整个单词 -E:使用ERE -F:相当于fgrep,不支持正则表达式REGEXP : 由一类特殊字符及文本字符所编写的模式,其中有些字符 (元字符)不表示字符字面意义,而表示控制或通配的功能
程序支持: grep,sed,awk,vim,less,nginx,varnish等
分两类:
基本正则表达式:BRE 扩展正则表达式:ERE grep -E,egrep正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块 PCRE(Perl Compatible Regular Expressions)元字符分类(正则表达式分4种): 字符匹配、匹配次数、位置锚定、分组
查看man帮助 man 7 regex字符匹配:
. 匹配任意单个字符【】匹配指定范围内的任意单个字符【^】匹配指定范围外的任意单个字符【:digit:】任意数字【:lower:】任意小写字母【:upper:】任意大写字母【:alpha:】任意大小写字母,即A-Z,a-z【:alnum:】任意数字或字母【:blank:】空白字符(空格和制表符)【:space:】水平或垂直空白字符 包括blank【:punct:】标点符号【:print:】可打印字符【:cntrl:】不可打印的控制字符(退格、删除、警铃...)【:graph:】可打印的非空白字符
匹配次数:
用在要指定次数的字符后面,用于指定前前面的字符要出现的次数* 匹配前面的字符任意次,包括0次 贪婪模式:尽可能长的匹配. 星号 任意长度的任意字符\? 匹配其前面的字符0或1次\+ 匹配其前面的字符至少1次\{n\}匹配前面的字符n次\{m,n\}匹配前面的字符至少m次,之多n次\{,n\}匹配前面的字符至多n次\{n,\}匹配前面的字符至少n次
位置锚定,定位出现的位置:
^ 行首锚定,用于模式的最左侧 $ 行尾锚定,用于模式的最右侧 ^PATTERN$ 用于模式匹配整行 ^$ 空行 ^ [[:space:]]*$ 空白行 \< 或 \b 词首锚定,用于单词模式的左侧 \> 或 \b 词尾锚定,用于单词模式的右侧 \匹配整个单词
分组:
()将一个或多个字符捆绑在一起,当做一个整体进行处理,如:(root)+分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量命名方式为:
\1,\2,\3,…\1表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
分区示例
\(string1\+\(string2\)*\) \1:string1\+\(string2\)* \2:string2
后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
或者:| 示例:a|b:a或b C|cat:C或cat (C|c\)at:Cat 或categrep =grep -E
grep语法: egrep [options]PATTERN[file…] 扩展正则表达式的元字符: 字符匹配: .任意单个字符 []指定范围的字符 [^]不在指定范围的字符 次数匹配: *:匹配前面字符任意次 ?:0或1次 +:1次或多次 {m}:匹配m次 {m,n}:至少m,至多n次 1 位置锚定: ^:行首 $:行尾 <,\b:语首 >,\b:语尾 分组: () 后向引用:\1,\2,… 或者: a|b:a或b C|cat:C或cat (C|c)at:Cat或cat 扩展表达式示例: 1、显示三个用户root、mage、wang的UID和默认shell grep -Ew “(root|mage|alice)” /etc/passwd|cut -d: -f1,72、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
grep -Ew “^(_[[:alpha:]]+_?.|[[:alpha:]]+_?.*)()” /etc/rc.d/init.d/functions3、使用egrep取出/etc/rc.d/init.d/functions中其基名
echo /etc/rc.d/init.d/functions |grep -Ewo “[^/]$" 4、使用egrep取出上面路径的目录名 echo /etc/rc.d/init.d/functions |grep -Eo ".<” 5、统计last命令中以root登录的每个主机IP地址登录次数 last |grep -Eo " [0-9.]{7,}" |uniq -c |sort -nr 6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255 【0-9】|【1-9】【0-9】|1【0-9】【0-9】|2【0-4】【0-9】|2【0-5】【0-5】 7、显示ifconfig命令结果中所有IPv4地址 ifconfig | grep -wE '【1-9】【0-9】|1【0-9】【0-9】|2【0-4】【0-9】|2【0-5】【0-5】 8、将此字符串:welcome to xxxxxx 中的每个字符去重并排序,重复次数多的排到前面 echo welcome to xxxxxx |grep -Eo “[[:alpha:]]”|uniq -c|sort -nrvi:Visual Interface,文本编辑器 文本:ASCII,Unicode
文本编辑种类:
行编辑:sed 全屏编辑期:nano,vi vim-Vi Improved 其他编辑器: gedit 简单的图像编辑器 gvim 一个vim编辑器的图像版本 vim用法: vim [option]…file +#:打开文件后,让光标处于第#行的行首,+默认行尾 +/PATTERN:打开文件后,直接让光标处于第一个被PATTERN匹配到的行的行首 -b file:二进制方式打开文件 -d file file2…:比较多个文件 -m file:只读打开文件 ex file 或 vim -e 直接进入ex模式 如果该文件存在,文件打开并显示 内容;如果该文件不存在,当编辑后第一次存盘时创建它 模式编辑器:vim 击键行为时依赖于vim的"模式" 三种主要模式: 命令(Normal)模式:默认模式,移动光标,剪切/粘贴文本 插入(insert)或编辑模式:修改文本 扩展命令(extend command)模式:保存,退出等 Esc键 退出当前模式 Esc键 Esc 总是返回到命令模式 模式转换:vim 命令模式–>插入模式 i是原地切换修改模式 L:是行首修改模式 a:在光标之后修改 A:在行尾模式 o:在下面插入一行修改 O:在上面插入一行修改** 按 :进入ex模式 wq:存盘退出 q:不做修改直接退出 q!:直接强制退出 w: anoter(w后面跟空格和文件名)把修改后的存入另外一个文件 w!:强制 r :another(把另外一个文件的内容读入到当前内容)插入模式----------------------->命令模式 ESC 命令模糊----------------------->扩展命令模式 : 扩展命令模式------------------>命令模式 ESC,enter
扩展模式:
:q 不做修改直接退出 : q!直接强制退出 : w anoter(w后面跟空格和文件名)把修改后的存入另外一个文件 :w! 强制 :x 保存退出按":"进入Ex模式
创建一个命令提示符:处于底部的屏幕左侧 命令: w 写(存)磁盘文件 wq 写入并退出 x 写入并退出 q 退出 q! 不存盘退出 r filename 读文件内容到当前文件中 w filename 将当前文件内容写入另一个文件 !command 执行命令 r!command 读入命令的输出 写入颜色: 把颜色写进去CTRL+v+[ vim中的^[相当于echo中的\e=\033 1 命令模式光标跳转: 字符间跳转: h:左 l:右 j:下 k:上 #COMMAND:跳转由#指定的个数的字符 单词间跳转: w:下一个单词词首(空格隔开为一个单词) e:当前或下一单词的词尾(如果这个单词就一个字符就是当前单词或者后面是空白字符) b:当前或前一个单词的词尾(如果这个单词就一个字符或者前面有空白字符那就是当前单词) #COMMAND:由#指定一次跳转的单词数 当前页跳转: H:页首 M:页中间行 L:页底 行首行尾跳转: ^:跳转至行首的第一个非空白字符 0:跳转至行首 $:跳转至行尾 行间移动: #G、扩展模式:#:跳转至由#指定行 G:最后一行 1G,gg:第一行 句间移动: ):下一句 (:上一句 段落间移动: }:下一段 (.+空格为判断一个句子) {:上一段 (中间有空行的叫段落) 命令模式翻屏操作: ctrl+f:向文件尾部翻一屛 ctrl+b:向文件首部翻一屛 ctrl+d:向文件尾巴翻半屛 ctrl+u 向文件首部翻半屛 命令模式操作: 字符编辑: x:删除光标处的字符 #x:删除光标处起始的#个字符 xp:交换光标所在处的字符及其后面字符的位置 ~:转换大小写 J:删除当前行后的换行符 替换命令:(r,replace) r:替换光标所在处的字符 R:切换成REPLACE模式 删除命令:d d:删除命令,可结合光标跳转字符,实现范围删除 d¥:从光标(包括光标)删除到行尾 d0:从光标(不包括光标)之前删除到行首 d^:从光标(不包括光标)之前删除到非空行首 dw:删除到当前或下一个单词词首 de:删除到当前或下一个单词词尾 db:删除到当前上一个单词词首 dd:删除所在的行 dd:多行删除 D=d’dollar’;删到行尾留空行 复制命令:y,yank y:复制,行为相似于d命令 y¥:从光标(包括光标)复制到行尾 y0:从光标(不包括光标)之前复制到行首 y^:从光标(不包括光标)之前复制到非空行首 yw:复制到当前或下一个单词词首 ye:复制到当前或下一个单词词尾 yb:复制到当前上一个单词词首 #yy:多行复制 yy:复制行 Y:复制整行 pP黏贴位置上下之分 黏贴命令:p,paste p:缓冲区存的如果为整行,则黏贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面 P:缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面 改变命令:c,change c:修改后切换成插入模式 命令模式---->插入模式 c¥:删除光标之后的行后,进入insert模式 c0:从光标删除到行首() c^:从光标删除到非空行首(不包括光标) cw:删除所在单词 ce:删除到后一个单词 cb:删除到上一个单词 #cc:多行插入 cc:删除当前行并输入新内容,相当于S C:删除当前光标到行尾并进入insert模式=从c $ 其他: 100iwang[ESC]粘贴"wang"100次 Command: y复制、d删除、gU变大写、gu变小写 比如0y¥命令意味着: 0:先到行头 y:从这里开始拷贝 ¥:拷贝到本行最后一个字符 ye从当前位置拷贝到本单词的最后一个字符1 地址定界:
:start_pos,end_pos #:具体第#行,例如2表示第2行 #,#:从左侧#表示起始行,到右侧#表示结尾行 #,+#:从左侧#表示的起始行,加上右侧#表示结尾行 :2,+3表示2到5行 .:当前行 $:最后一行 .,¥-1当前行到倒数第二行 2,.d :从第2行删出到光标处 2,+3 d:删除第2行到第5行 %:全文,相当于1,¥ /pat1/,/pat2/: 从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束 #,/pat/ /pat/,¥ 使用方法:后跟一个编辑命令 d:删除 y:复制 w file:将范围内的行另存至指定文件中 r file:在指定位置插入指定文件中的所有内容 查找: /PATTERN:从当前光标所在处向文件尾部查找 ?PATTERN:从当前光标所在处向文件首部查找 n:与命令同方向 N:与命令反方向 查找并替换: s:在扩展模式下完成查找替换操作 格式:s/要查找的内容/替换为的内容/修饰符 要查找的内容:可使用模式 替换为的内容:不能使用模式,但可以使用\1,\2,…等后向引用符号;还可以使用"&"引用前面查找时查找到的整个内容 修饰符: i:忽略大小写 g:全局替换;默认情况下,每一行只替换第一次出现 gc:全局替换,每次替换前询问 查找替换中的分隔符/可替换为其他字符,例如: s@/etc@/var@g s#/boot#/#i 撤销更改: u :撤销最近的更改 #u:撤销之前多次更改 U :撤销光标落在这行后所有此行的更改 . :重复前一个操作 n.:重复前一个操作n次 按ctrl +r 重做最后的’撤销更改1 有26个命令寄存器和1个无命名寄存器,常存放不同的剪贴板内容,可以不同会话间共享
2 寄存器名称a,b,…,z,格式:"寄存器"放在数字和命令之间 如:3"tty"表示复制3行到t寄存器中 "tp"表示将t寄存器内容粘贴 3 未指定,将使用无命名寄存器 4 有10个数字寄存器,用0,1,…9表示,0 存放最近复制内容,1存放最近删除内容,当心的文本变更和删除时,1转存到2,2转存到3,以此类推。数字寄存器不能在会话间共享 编辑二进制文件: 以二进制方式打开文件 vim-b binaryfile 扩展命令模式下,利用xxd命令转换为可读的十六进制 :%!xxd 编辑二进制文件 扩展命令模式下,利用xxd命令转换回二进制 :%!xxd -r 保存退1 允许选择的文本快
v面向字符 V面向行 ctrl -v 面向块 2 可视化键可用于与移动键结合使用: w ) }箭头等 3 突出显示的文字可被删除,复制,变更,过滤,搜索,替换等 编辑二进制文件: vim file1 file2 file3 … :next 下一个 :prev 前一个 :first 第一个 :last 最后一个 :wall 保存所有 :qall 退出所有 :wqall 使用多个窗口: 多文件分割: vim -o|-O file1 file2 … -o:水平分割 -O:垂直分割 在窗口间切换:ctrl +w,arrow 单文件窗口分割: ctrl+w,s:split,水平分割 ctrl+w,v:vertical,垂直分割 ctrl+w,q:取消相邻窗口 ctrl+w,o:取消全部窗口 :wqall 退出1 配置文件:永久有效
全局:/etc/vimrc 个人:~/.vimrc 扩展模式:当前vim进程有效 行号 显示:set number, 简写为set nu 取消显示:set nonumber, 简写为set nonu 忽略字符的大小写 启用:set ic 不忽略:set noic 自动缩进 启用:set ai 禁用:set noai 智能缩进 启用:smartindent 简写 set si 禁用:set nosi 高亮搜索 启用:set hlsearch 禁用:set nohlsearch 语法高亮 启用:syntax on 禁用:syntax off 显示Tab和换行符 ^I 和$显示 启用:set list 禁用:set nolist 配置 vi and vim文件格式 启用windows格式:set fileformat=dos 启用unix格式:set fileformat=unix 简写: set ff=dos|unix 设置文本宽度 启用: set textwidth=65 (vim only) 禁用: set wrapmargin=15 设置光标所在行的标识线 启用:set cursorline,简写cul 禁用:set no cursorline 复制保留格式 启用: set paste 禁用: set nopaste Set 帮助 :help option-list :set or :set all vi/vim内置帮助 :help :help topic Use :q to exit help vimtutor1 程序:指令+数据
2 程序变成风格: 过程式:以指令为中心,数据服务于指令 对象式:以数据为中心,指令服务于数据 **shell程序格:**提供了编程能力,解释执行 程序的执行方式 计算机:运行二进制指令 编程语言: 低级:汇编 高级: 编译:高级语言–>编译器–>目标代码 java,C# 解释:高级语言–>解释器–>机器代码 shell,perl,python 程序的执行方式 编程逻辑处理方式: 顺序执行 循环执行 选择执行 shell编程: 过程式、解释执行 编程语言的基本结构: 各种系统命令的组合 数据存储:变量、数组 表达式:a+b 语句:if shell脚本: 包含一些命令或声明,并符合一定格式的文本文件 格式要求:首行shebang机制 #!/bin/bash #!/usr/bin/python #!/usr/bin/perl shell脚本的用途有: 自动化常用命令 执行系统管理和故障排除 创建简单的应用程序 处理文本或文件 创建shell脚本: 第一步:使用文本编辑器来创建文本文件 第一行必须包括shell声明序列:#! #!/bin/bash 添加注释 注释以#开头 第二步:运行脚本 给予执行权限,在命令行上指定脚本的绝对或相对路径 直接运行解释器,将脚本作为解释器程序的参数运行 脚本规范: 脚本代码开头约定 1、第一行一般为调用使用的语言 2、程序名,避免更改文件名为无法找到正确的文件 3、版本号 4、更改后的时间 5、作者相关信息 6、该程序的作用,及注意事项 7、最后是各版本的更新简要说明#!/bin/bash#===============================================#Author: MMMMM#QQ: xxxxxxx#Date: 2019-02-22#Filename: aa.sh#URL: xxxxxxxxxx#Description: The test script#Copyright(c): 2019ALL rights reserved#================================================
1 脚本调试:
1、检测脚本中的语法错误 bash -n /path/to/some_script 2、调试执行 bash -x /path/to/some_script(bash -x 两个+号表示嵌套深度)[root@centos7 ~]#bash -x createuser3.sh + username=0+ for i in '{1..3}'+ read -p 'Plsease input your username: ' usernamePlsease input your username: a+ '[' -z a ']'+ useradd a+ echo The usera was be createdThe usera was be created
1 变量:命名的内存空间
数据存储方式: 字符: 数值:整形,浮点型 变量:变量类型 作用: 1、数据存储格式 2、参与的运算 3、表示的数据范围 类型: 字符 数值:整形、浮点型 引用变量要加$符号;shell脚本语言,i=10会认为10是字符串 变量 强类型:变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转换。一般定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误。 如 java,c# 弱类型:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用 如:bash不支持浮点数,php 变量命名法则: 1、不能使程序中的保留字:例如if,for 2、只能使用数字、字母及下划线,且不能以数字开头 3、见名知义 4、统一命名规则:驼峰命名法1 根据变量的生效范围等标准划分下面变量类型:
局部变量:生效范围为当前shell进程;对当前shell之外的其他shell进程,包括当前shell的子shell进程均无效(局部变量 有一定范围,只能在当前终端会话) 环境(全局)变量:生效范围为当前shell进程及其子进程(export 全局(环境)变量定义。父进程可以往下传给子进程,子进程不能往上传) 本地变量:生效范围为shell进程中某代码片段,通常指函数 位置变量:$1,2,。。。。来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数 特殊变量:¥?(判断命令返回值),¥0,¥*,¥@,¥#(有几个参数),¥¥进程的编号 set命令可以显示所有变量,包括全局变量还是局部变量,函数 一般建议编写脚本时候,用完变量要用unset删除变量,不然不会释放内存空间 1、局部变量 有一定范围,只能在当前终端会话 2、局部变量无法在其他进程体现,只能在当前shell,不能往上传,往下传 3、export 全局(环境)变量定义。父进程可以往下传给子进程,子进程不能往上传 4、declare -x 和export都有可以申明全局变量 5、env,export也能显示所有的环境变量1 变量声明、赋值:
export name=VALUE declare -x name=VALUE 2 变量引用: $name,${name} 3 显示所有环境变量: env printenv export declare -x 4 删除变量: unset name 5 环境变量: PATH SHELL USER UID HOME PWD SHLVLshell 嵌套深度,嵌套几次 LANG MAIL HOSTNAME HISTSIZE _前一个命令最后参数 6 只读和位置变量: 只读变量:只能声明,但不能修改和删除 声明只读变量: readonly name declare -r name 查看只读变量: readonly -p 位置变量:在脚本代码种调用通过命令行传递给脚本的参数 $1,$2,…:对应第1 、第2等参数,shift[n]换位置 $0:命令本身 ¥*:传递给脚本的所有参数,全部参数合为一个字符串 ¥@:传递给脚本的所有参数,每个参数为独立字符串 ¥#:传递给脚本的参数的个数 ¥@¥\8:只在被双引号包起来的时候才会有差异 set --清空所有位置变量 1、常量的生命期就是这个进程的有效期 declare -r 显示系统常量|readonly -p 2、()小括号用法,只是一次性,因为开启了一次小shell,就在当前生效,以后不生效 3、()在命令结束后不去影响这个环境 4、{}会影响当前的shell环境 5、小括号开启的shell不影响当前shell环境,而大括号不开启shell,会影响当前环境,共同点是把括号里的多个命令作为整体执行 6、{}要加空格1 退出状态:
进程使用退出状态来报告成功或失败 0:代表成功,1-255代表失败 $?变量保存最近的命令退出状态 如:ping -c1 -w1 hostdown &>/dev/nullecho $?
$?返回的结果是否为0是最后一条命令决定的,但是语法错误,前面就错误了后面不执行,
exit就是退出后面写多少就是返回多少,可以不让$?为0
2 退出状态码: bash自定义退出状态码 exit[n]:自定义退出状态码 注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字 注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令 的状态码 exit退出当前shell 在脚本就是退出当前脚本3 算数运算:
bash中的算数运算:help let +,-,,/,%取模(取余),**(乘方) 实现算数运算: 1、let var =算术表达式 2、var=¥[算术表达式] 3、var=¥((算术表达式)) 4、var=¥(expr arg1 arg2 arg3 …) 5、declare -i var =数值 6、echo ‘算数表达式’ |bc 乘法符号有些场景中需要转义,如 bash有内建的随机数生成器:$RANDOM(0-32767) echo $[¥RANDOM%50]:0-49之间随机数expr命令本身就是做运算
0 false
1 true & 并且and | 或者 or 0&0=0 0&1=0 1&0=0 1&1=1 0|0=0 1|0=1 0|1=1 1|1=1 短路与 && 0&&0=0 0&&1=0 1&&0=0 1&&1=1 cmd1 && cmd2 如果cmd1=0为假, cmd2不需要执行,反之cmd1为真,需要cmd2执行 短路或 | | 如果cmd1为真,cmd2不需要执行,反之cmd1为假,需要cmd2执行 XOR 异或 0^1=1 0^0=0 1^0=1 1^1=0 一样就假,不一样就真,同性相斥,异性相吸4 赋值:
增强型赋值: + =,- =,/=/%= let varOPERvalue: 例如:let count+=3 自加3后自赋值 自增,自减: let var+=1 let var ++ let var -=1 let var –5 逻辑运算:
非:! !1=0 !0=1 短路运算 短路与 第一个为0,结果必定为0 定一个为1,第二个必须要参与运算 短路或 第一个为1,结果必定为1 定一个为0,第二个必须要参与运算 异或:^ 异或d 两个值,相同为假,不同为真6 bash的快捷键:
ctrl +a:光标移到命令行首,相当于Home ctrl +e:光标移到命令行尾,相当End ctrl +f:光标向右移动一个字符 ctrl +b:光标向左移动一个字符 alt +f:光标向右移动一个单词尾 alt +b:光标向左移动一个单词首 ctrl +xx:光标在命令行首和光标之间移动 ctrl +u:从光标处删除至命令行首 ctrl +k:从光标处删除至命令行尾 alt +r:删除当前整行 ctrl +w:从光标处向左删除至单词首 alt +d:从光标处向右删除至单词尾 ctrl +d:删除光标处的一个字符 ctrl +h:删除光标前的一个字符 ctrl +y:将删除的字符粘贴至光标后 atl +c:从光标处开始向右更改位首字母大写的单词 alt +u:从光标处开始,将右边一个单词更改为大写 alt +l:从光标处开始,将右边一个单词更改为小写 ctrl +t:交换光标处和之前的字符位置 alt+t:交换光标处和之前的单词位置 alt+N:提示输入指定字符后,重复显示该字符N次 注意:alt组合快捷键经常和其他软件冲突7 条件测试:
判断某需求是否满足,需要由测试机制来实现 专用的测试表达式需要由测试命令复制完成测试过程 评估布尔声明,以便用在条件性执行中 若真,则返回0 若假,则返回1 测试命令: test EXPRESSION [EXPRESSION] [[EXPRESSION]] 注意:EXPRESSION 前后必须有空白字符8 bash的字符串测试:
=:是否等于 >:ascii码是否大于ascii码 <:是否小于 !=:是否不等于 =~:左侧字符串是否能够被右侧的PATTERN所匹配,注意:此表达式一般用于[[]]中;扩展的正则表达式 -z"STRING"字符串是否为空,空为真,不空为假 -n"STRING"字符串是否不空,不空为真,空为假 注意:用于字符串比较时 用到的操作数都应该使用引号9 逻辑运算:
非:! !1=0 !0=1 短路运算 短路与 第一个为0;结果必定为0 第一个为1;第二个必须要参与运算 短路或 第一个为1;结果必定为1 第一个为0;第二个必须要参与运算 异或:^ 异或的两个值,相同为假,不同为真10 条件性的执行操作符:
根据退出状态而定,命令可以有条件地运行 &&代表条件性的 and then ||代表条件性的or else 例如: grep -q no_such_user /etc/passwd ||echo ‘no such user’ no such user ping -c1 -w2 station1 &>/dev/null && echo ‘station1 is up’ || (echo ‘station is unreachable’ ;exit 1) station is up 长格式的例子: test “ A " = " A" =" A"="B” &&echo “String are equal” test “ A " − e q " A" -eq " A"−eq"B” && echo “Integers are equal” 简写格式的例子: [ “ A " = " A" = " A"="B” ] &&echo “String are equal” [ “ A " − e q " A" -eq " A"−eq"B” ] && echo “Integers are equal”11 bash的文件权限测试:
文件权限测试: -r FILE:是否存在且可读 -w FILE:是否存在且可写 -x FILE:是否存在且可执行 文件特殊权限测试: -u FILE:是否存在且拥有suid权限 -g FILE:是否存在且拥有sgid权限 -k FILE:是否存在且拥有sticky权限 存在性测试: -a FILE:同-e -e FILE:文件存在测试,存在为真,否则为假 存在性及类别测试: -b FILE:是否存在且为块设备文件 -c FILE:是否存在且为字符设备文件 -d FILE:是否存在且为目录文件 -f FILE:是否存在且为普通文件 -h FILE 或 -l FILEE:存在且为符号链接文件 -p FILE:是否存在且为命名管道文件 -S FILE:是否存在且为套接字文件 文件大小测试: -s FILE:是否存在且非空 文件是否打开 -t fd:fd文件描述符是否在某终端 -N FILE:文件自从上一次被读取之后是否被修改过 -O FILE:当前有效用户是否为文件属主 -G FILE:当前有效用户是否为文件数组 双目测试: FILE -ef FILE2:FILE1是否是FILE2的硬链接 FILE -nt FILE2:FILE1是否新于FILE2(mtime) FILE -ot FILE2:FILE1是否旧于FILE212 bash的文件权限测试:
第一种方式: COMMAND1&& COMMAND2 并且 COMMAND1|| COMMAND2 或者 !COMMAND非 如: [[-r FILE]] && [[-w FILE]] 第二种方式: EXPRESSION1 -a EXPRESSION2 并且 EXPRESSION1 -o EXPRESSION2 或者 !EXPRESSION 必须使用测试命令进行 示例: [ -z “$HOSTNAME” -o $HOSTNAME == “localhost”] && hostname 1111 [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab13 使用read命令来接受输入:
使用read来把输入值分配给一个或多个shell变量 -p 指定要显示的提示 -s 静默输入,一般用于密码 -n N指定输入的字符长度N -d '字符’输入结束符 -t N TIMEOUT为N秒 read 从标准输入中读取值,给每个单词分配一个变量所有剩余单词都被分配给最后一个变量 read -p "Enter a filename:"FILE read默认是给变量赋值14 防止扩展:
反斜线()会使随后的字符按原意解释 $ echo Your cost : \¥5.00 Your cost : \¥5.00 加引号来防止扩展 单引号(’)防止所有扩展 双引号(")也防止所有扩展,但是一下情况例外: ¥(美元符号) -变量扩展 `(反引号)-命令替换 (反斜线) - 禁止单个字符扩展 !(叹号) -历史命令替换 15 注意: 检查参数个数和是否是数字要用[[]]和扩展正则表达式 test =[]中括号,=两边要空格,不空为赋值 -eq相等,-ne不相等,-lt小于,-le小于等于,-gt大于,-ge大于等于 test 还支持文件系统 -f是否是不同文件(前面是-的就是普通文件) -a从-e判断文件是否存在 -b判断文件是否块文件 -d是否是文件夹 -L是否是软连接 -w是否可写,针对普通用户 -x是否可执行,针对普通用户 会判断指向的,而不是判断本身的 -n是否不为空 -v是判断这个变量是否设置了,是否有值 -z判断长度是否为0是否为空 -eq是比较数字的 =是比较字符串的 【【】】是正则表达式,不用正则表达式一般用[]一个中括号 总结: shell 变量:局部(当前shell)和环境(可以传给子shell) 1 , 1, 1,@当做单个参数, ∗ 当 作 整 个 参 数 , * 当作整个参数, ∗当作整个参数,#参数个数,$0脚本名字 set unset export declare -i定义数字变量 -r只读的 -x环境变量 env16 实例:判断一个用户否存在,且用112233做密码
id $1 &>/dev/null [ $? -eq 0 ] && echo user is exist && exit useradd $1 echo 112233| passwd --stdin &>/dev/null echo “$1” is created 小括号会开启子shell,大括号不会退出当前脚本按生效范围划分,存在两类:
全局配置: /etc/profile /etc/profile.d/*.sh /etc/bashrc 个人配置: ~/.bash_profile ~/.bashrc etc全局 ~家目录 单个用户 bash——profile 可改PATH路径 profile配置文件/etc/profile 和 .bash_profile /etc/bashrc和.bashrc中的区别 登录时的执行顺序
1 shell登录两种方式
交互式登录: (1)直接通过终端输入账号密码登录 (2)使用"su -UserName"切换的用户 执行顺序:/etc/profile–>/etc/profile.d/*.sh–>/.bash_profile–>/.bashrc–>/etc/bshrc 非交互式登录: (1)su UserName (2)图形界面下打开的终端 (3)执行脚本 (4)任何其他的bash实例 执行顺序:~/.bashrc–>/etc/bashrc–>/etc/profile.d/*sh2 Profile类
按功能,存在两类: profile类额bashrc类 profile类:为交互式登录的shell提供配置 全局:/etc/profile,/etc/profile.d/*.sh 个人:~/.bash_profile 功用 1、用于定义环境变量 2、运行命令或脚本 profile 放环境变量和启动程序 bashrc放别名和函数3 Bash 退出任务
保存在~/.bash_logout文件中(用户) 在退出登录shell时运行 用于 创建自动备份 清楚临时文件 注销初始化 希望退出的时候 初始化 ,自动执行某个操作 vim 。bash_logout4 $-变量
h:hashall,打开这个选项后,shell会将命令所在的路径hash下来,避免每次都要查询。通过set +h将h选项关闭 i:interactive-comments,包含这个选项说明当前的shell是一个交互式的shell。所谓的交互式shell,在脚本中,i选项是关闭的。 m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执行等。 B:braceexpand,大括号扩展 H:history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回上最近的一个历史命令,"!n"返回第n个历史命令上 一 个 命 令 的 最 后 参 数 ∗ ∗ ∗ ∗ _上一个命令的最后参数** ** 上一个命令的最后参数∗∗∗∗-代表一些功能的复合
h=hash i=当前是否是一个交互式的shell 可查看脚本批量执行还是交互式会问你是否执行 m=前后执行 b大括号扩展 H扩展代表history历史转载地址:http://fwkgn.baihongyu.com/