一、文本编辑工具之神VIM的基本设置和用法
1.vim命令
+# 打开文件后,让光标处于第#行的行首,+默认行尾
+/PATTERN 让光标处于第一个被PATTERN匹配到的行行首
-b file 二进制方式打开文件
-d file1 file2… 比较多个文件,相当于 vimdiff
-m file 只读打开文件
-e file 直接进入ex模式,相当于执行ex file
2.vim 三种主要模式和转换
(1)三种常见模式:
<1>命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本
<2>插入(Insert)或编辑模式:用于修改文本
<3>扩展命令(extended command )或命令(末)行模式:保存,退出等
(2)
(2)模式转换:
<1>命令模式 --> 插入模式
i insert, 在光标所在处输入
I 在当前光标所在行的行首输入
a append, 在光标所在处后面输入
A 在当前光标所在行的行尾输入
o 在当前光标所在行的下方打开一个新行
O 在当前光标所在行的上方打开一个新行
<2>插入模式 --- ESC-----> 命令模式
<3>命令模式 ---- : ----> 扩展命令模式
<4>扩展命令模式 ----ESC,enter----> 命令模式
(3)扩展命令模式常用命令
<1>基本命令
w 写(存)磁盘文件
wq 写入并退出
q! 不存盘退出,即使更改都将丢失
<2>地址定界
# 具体第#行,例如2表示第2行
#,# 从左侧#表示起始行,到右侧#表示结尾行
#,+# 从左侧#表示的起始行,加上右侧#表示的行数,范例:2,+3 表示2到5行
. 当前行
$ 最后一行
.,$-1 当前行到倒数第二行
% 全文, 相当于1,$
<3>定制vim的工作特性
配置文件:永久有效
全局:/etc/vimrc
个人:~/.vimrc
扩展命令模式:当前vim进程有效
基本配置如下:
设置tab键的长度:set ts=4
set expandtab
设置行号: setnumber
忽略字符的大小写:set ignorecase
显示Tab键和换行符^l和$显示:set list
二、文本常见处理工具
- 文件内容查看命令:cat
-A:显示所有控制符
-n:对显示出的每一行进行编号
-b:非空行编号
-s:压缩连续的空行成一行
tac 逆向显示文本内容
nl 显示行号,相当于cat -b
rev 将同一行的内容逆向显示
2.查看非文本文件内容
(1)Hexdump
-b单字节八进制显示
-c单字节字符显示
-标准十六进制+ASCII显示
-d双字节十进制显示
-o双字节八进制显示
-x双字节十六进制显示
-e用于显示数据的格式字符串
-f format_file文件,包含格式字符串
-n长度仅解释输入的长度字节
-s偏移量从开始处跳过偏移量字节
-v显示,不挤压类似线条
-V输出版本信息并退出
(2)Od
(3)xxd
3.分页查看文件内容
(1)more 可以实现分页查看文件,可以配合管道实现输出信息的分页
-d: 显示翻页及退出提示
(2)less 也可以实现分页查看文件或STDIN输出
4.显示文本前或后行内容
(1)head 可以显示文件或标准输入的前面行
-c # 指定获取前#字节
-n # 指定获取前#行
-# 同上
(2)tail 和head 相反,查看文件或标准输入的倒数行
-c # 指定获取后#字节
-n # 指定获取后#行
-# 同上
-f 跟踪显示文件fd新追加的内容,常用日志监控,相当于 --follow=descriptor,当文件删除再新建同名文
件,将无法继续跟踪文件
-F 跟踪文件名,相当于--follow=name --retry,当文件删除再新建同名文件,将可以继续跟踪文件
tailf 类似tail –f,当文件不增长时并不访问文件
5.按列抽取文本 cut
d DELIMITER: 指明分隔符,默认tab
-f FILEDS:
#: 第#个字段,例如:3
#,#[,#]:离散的多个字段,例如:1,3,6
#-#:连续的多个字段, 例如:1-6
混合使用:1-3,7
-c 按字符切割
--output-delimiter=STRING指定输出分隔符
6.合并多个文件:paste
-d 分隔符:指定分隔符,默认用TAB
-s : 所有行合成一行显示
7.分析文本的工具
(1)文本数据统计:wc(命令可用于统计文件的行总数、单词总数、字节总数和字符总数,可以对文件或STDIN中的数据统计)
-l 只计数行数
-w 只计数单词总数
-c 只计数字节总数
-m 只计数字符总数
-L 显示文件中最长行的长度
(2)整理文本:sort(把整理过的文本显示在STDOUT,不改变原始文件)
-r 执行反方向(由上至下)整理
-R 随机排序
-n 执行按数字大小整理
-f 选项忽略(fold)字符串中的字符大小写
-u 选项(独特,unique)删除输出中的重复行
-t c 选项使用c做为字段界定符
-k # 选项按照使用c字符分隔的 # 列来整理能够使用多次
(3)去重uniq(从输入中删除前后相接的重复的行)
-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行
(4)比较文件:diff和patch
<1>diff:diff 命令的输出被保存在一种叫做“补丁”的文件中
使用 -u 选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件
<2>patch 复制在其它文件中进行的改变(要谨慎使用)
适用 -b 选项来自动备份改变了的文件
三、正则表达式:
基本正则表达式 :BRE
扩展正则表达式 :ERE
- 基本正则表达式元字符
(1) 字符匹配
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符,示例:[^wang]
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
(2) 匹配次数
* 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
\? 匹配其前面的字符0或1次,即:可有可无
\+ 匹配其前面的字符至少1次,即:肯定有
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
(3) 位置锚定
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定,用于单词模式的右侧
\<PATTERN\> 匹配整个单词
(4) 分组其它
<1>分组:() 将一个或多个字符捆绑在一起,当作一个整体处理,如:\(root\)+分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
<2>或者:\|
范例:
a\|b #a或b
C\|cat #C或cat
\(C\|c\)at #Cat或cat
2.扩展正则表达式
(1)字符匹配元字符
. 任意单个字符
[wang] 指定范围的字符
[^wang] 不在指定范围的字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
(2)次数匹配
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
(3)位置锚定
^ 行首
$ 行尾
\<, \b 语首
\>, \b 语尾
(4)分组其它
() 分组
后向引用:\1, \2, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat
四、文本处理三剑客之grep
(1)常见选项
--color=auto 对匹配到的文本着色显示
-m # 匹配#次后停止
-v 显示不被pattern匹配到的行
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ’ -e ‘dog’ file
-w 匹配整个单词
-E 使用ERE,相当于egrep
-F 相当于fgrep,不支持正则表达式
-f file 根据模式文件处理选项
-r 递归目录,但不处理软链接
-R 递归目录,但处理软链接
五、shell脚本对虚拟机的基本配置以及一些脚本的编写
1.颜色设置:vim /etc/profile.d/env.sh
PS1=”\[\e[1;36m\][\u@\h \W]\$\[\e[0m\]”
2.vim脚本设置:vim .vimrc
set number
set ic
set ts=4
set expandtab
set ignorecase
set autoindent
autocmd BufNewFile *.sh exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2,"#")
call setline(3,"#***************************************************")
call setline(4,"#Author: lidanyue")
call setline(5,"#QQ: 862851911")
call setline(6,"#Date: ".strftime("%Y-%m-%d"))
call setline(7,"#FileName: ".expand("%"))
call setline(8,"#URL: https://www.cnblogs.com/lidanyue/")
call setline(9,"#Description: The test script")
call setline(10,"#Copyright(C): ".strftime("%Y")." All rights reserved")
call setline(11,"#***************************************************")
call setline(12," ")
endif
endfunc
autocmd BufNewFile * normal G
3.修改网卡名称,恢复传统的网卡命名
[root@centos8 ~]#vim /etc/default/grub
修改的地方
GRUB_CMDLINE_LINUX="crashkernel=auto resume=UUID=eebe3bc7-6d52-4ad9-86aa-916f1a123fd4 rhgb quiet net.ifnames=0"
[root@centos8 ~]#grub2-mkconfig -o /boot/grub2/grub.cfg
[root@centos8 ~]#reboot
4.改为静态地址:cd/ etc/sysconfig/network -scripts
文件名: Cat > ifcfg -eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.8
PREFIX=24
GATEWAY=10.0.0.2
DNS1=10.0.0.2
DNS2=180.76.76.76
ONBOOT=yes
5.关防火墙
Cd /etc/sysconfig/ network-scripts
Systemctl disable firewalld.service
6.改SELINUX:
Vim /etc/selinux/config
将SELINUX=enforcing改为SELINUX=disabled
7.显示系统信息脚本:
RED="\E[1;31m"
GREEN="\E[1;32m"
END="\E[0m"
echo -e "$GREEN----------------------Host systeminfo--------------------$END"
echo -e "HOSTNAME: $RED`hostname`$END"
echo -e "IPADDR: $RED` ifconfig eth0|grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' |head -n1`$END"
echo -e "OSVERSION: $RED`cat /etc/redhat-release`$END"
echo -e "KERNEL: $RED`uname -r`$END"
echo -e "CPU: $RED`lscpu|grep 'Model name'|tr -s ' '|cut -d : -f2`$END"
echo -e "MEMORY: $RED`free -h|grep Mem|tr -s ' ' : |cut -d : -f2`$END"
echo -e "DISK: $RED`lsblk |grep '^sd' |tr -s ' ' |cut -d " " -f4`$END"
echo -e "$GREEN---------------------------------------------------------$END"
8.执行脚本的四种方法:
#执行方法1
[root@centos8 ~]#bash /data/hello.sh
#执行方法2
[root@centos8 ~]#cat /data/hello.sh | bash
#执行方法3
[root@centos8 ~]#chmod +x /data/hello.sh
#绝对路径
[root@centos8 ~]#/data/hello.sh
#相法路径
[root@centos8 ~]#cd /data/;
[root@centos8 ~]#./hello.sh
#执行方法4,本方法可以实现执行远程主机的shell脚本
[root@centos8 ~]#yum -y install httpd
[root@centos8 ~]#systemctl start httpd
[root@centos8 ~]#mv /data/hello.sh /var/www/html/
[root@centos8 ~]#curl -s http://10.0.0.8/hello.sh|bash
9.删库跑路之命令rm的安全实现
[root@centos8 ~]#cat /data/scripts/rm.sh
WARNING_COLOR="echo -e \E[1;31m"
END="\E[0m"
DIR=/tmp/`date +%F_%H-%M-%S`
mkdir $DIR
mv $* $DIR
${WARNING_COLOR}Move $* to $DIR $END
[root@centos8 ~]#chmod a+x /data/scripts/rm.sh
[root@centos8 ~]#alias rm='/data/scripts/rm.sh'
[root@centos8 ~]#touch {1..10}.txt
[root@centos8 ~]#rm *.txt
Move 10.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt to /tmp/2020-
04-01_15-15-28
10.随机字体颜色
[root@centos7 scripts]$echo -e "\E[1;$[RANDOM%7+31]mhello\e[0m"
Hello
11.生成 0 - 49 之间随机数
[root@centos7 scripts]$echo $[$RANDOM%50]
12.网络状态判断
[root@centos8 ~]#cat /data/scripts/ping.sh
IP=172.16.0.1
ping -c1 -W1 $IP &> /dev/null && echo "$IP is up" || { echo "$IP is
unreachable"; exit; }
echo "Script is finished"
[root@centos8 ~]#bash /data/scripts/ping.sh
172.16.0.1 is up
Script is finished
13.磁盘空间和Inode号的检查脚本
[root@centos8 scripts]#cat disk_check.sh
WARNING=80
SPACE_USED=`df | grep '^/dev/sd'|grep -oE '[0-9]+%'|tr -d %| sort -nr|head -1`
INODE_USED=`df -i | grep '^/dev/sd'|grep -oE '[0-9]+%'|tr -d %| sort -nr|head -1`
[ "$SPACE_USED" -gt $WARNING -o "$INODE_USED" -gt $WARNING ] && echo "DISK
USED:$SPACE_USED%, INODE_USED:$INODE_USED,will be full" | mail -s "DISK Warning" 网址