张贺,多年互联网工作经验,担任过网络工程师、系统集成工程师、LINUX系统运维工程师,负责过大规模集群架构自动化运维管理工作,擅长Web集群架构与自动化运维,曾负责国内某电商运维工作。
笔者微信:zhanghe15069028807
文本处理最厉害的工具是文本处理”三剑客”(grep、sed、awk),一定要用的熟练,三剑客像是三本一流剑谱:太极剑法(变化多端,用意不用力)、辟邪剑法(唯快不破)、独孤九剑(破解天下一切武功)。
三种剑法皆属于一流剑法,但是面对小喽啰的时候范不上用这种高深的武功,都无需拔剑,用一些江湖流传的螳螂拳、八卦掌、炮锤足矣!
文件处理类
ps1 bash提示符美化
export PS1='[[e[32;1m]u@[e[33;1m]H[e[34;1m] W[e[0m]]$'
PS1="[e[31;1m][[e[37;1m]A[e[36;1m]u@[e[32;1m]H w[e[31;1m]][e[33;1m]# [e[0m]"
效果如下:
如需持久生效可根据需求将其写入到家目录和./bashrc下或/etc/bashrc文件
wc
discription:word count
wc [option]… [file]…
–l:lines
-w:words
-c:bytes
[root@N2 ~]# cat test.txt
abxy
cab
abc
hello ha
[root@N2 ~]# wc test.txt
4 5 22 test.txt
[root@N2 ~]# wc -l test.txt
4 test.txt
[root@N2 ~]# wc -w test.txt
5 test.txt
[root@N2 ~]# wc -c test.txt
22 test.txt
cut
-d:指定分隔符,只能指定一个,awk可以指定多个
-f:挑选字段
#单个字段
#-#:连续多个字段
#,#:离散的多个字段
[root@N2 ~]# cut -d: -f1,3 /etc/passwd | head -3
root:0
bin:1
daemon:2
sort
sort [OPTION]... [FILE]...
-n:基于数据大小而字符进行排序,默认是根据字符排序
-t:指定分隔符
-k #:指定用于比较的字段
-r:逆序排序
-f忽略字符大小写
-u:重复的行只保留一份,重复行是指连续且相同
//显示/passwd当中Uid最大的那个用户
sort -n -t":" -k3 /etc/passwd | tail -1 | awk -F":" '{if(NR=1)print $1}'
nfsnobody
//显示passwd当中uid最大的用户名
sort -n -r -t":" -k3 /etc/passwd | tail -1 | awk -F":" '{if(NR=1)print $1}'
root
//取出/etc/passwd文件第6行到第10行,并将这些信息按照第三个字段大小进行排序,最后仅显示uid最大的用户名:
head -10 /etc/passwd|tail -4|sort -n -t: -k3|tail -1|cut -d: -f1
uucp
sed -n "6,10p" /etc/passwd | sort -n -t: -k 3 | tail -1|cut -d ":" -f1
uucp
uniq
uniq:报告或移除重复的行
-c:显示每行的重复次数
-u:仅显示未曾重复过的行
-d:仅显示重复过的行
[root@N2 ~]# cat test.txt
abxy
abxy
cab
abc
hello ha
//显示重复的次数
[root@N2 ~]# uniq -c test.txt
2 abxy
1 cab
1 abc
1 hello ha
//去除重复的行
[root@N2 ~]# uniq test.txt
abxy
cab
abc
hello ha
//显示不重复的行
[root@N2 ~]# uniq -u test.txt
cab
abc
hello ha
//仅显示重复过的行
[root@N2 ~]# uniq -d test.txt
abxy
//统计常用命令的top3,先把序号去掉,然后根据首字母排序,再显示次数,根据次数再排序,取出top3
history | awk '{print $2}' | sort | uniq -c | sort -nr | head -3
diff
[root@N2 ~]# cp /etc/fstab ./fstab.new
[root@N2 ~]# vim ./fstab.new
[root@N2 ~]# diff /etc/fstab ./fstab.new
5a6 #在第五行下面add了一行,变成了第6行
> zhanghe
[root@N2 ~]# diff /etc/fstab ./fstab.new
3c3 #第三行被change了
< # /etc/fstab #旧文件第三行原本是这样的
---
> # /etc/fstabzhanghe #新文件变成了这样
tr
替换不加选项
删除显示内容时才使用-d
//把/etc/passwd里面的冒号全都替换成空格
[root@N2 ~]# tr ':' ' ' < /etc/passwd
//将小写全部替换成大写
[root@N2 ~]# tr 'a-z' 'A-Z' < /etc/passwd
//将echo传递的内容里面的a删除
[root@N2 ~]# echo zhanghe | tr -d a
zhnghe
basename
取得一个文件的基名
[root@zhanghe ~]# basename /tmp/test.txt
test.txt
在脚本当中我们可以使用basename $0来取得脚本本身的名字,这样不用手动输入,而且如果脚本名要修改了,里面的路径是不用修改的,非常的方便。
[root@zhanghe ~]# vim test.sh
basename $0
[root@zhanghe ~]# /bin/bash test.sh
test.sh
文件查看类
tree
-d;只显示目录
-L:level,指定显示的层级数目
-p :pattern,只显示由指定pattern匹配到的路径
file
查看文件里面存储的什么内容
[root@N2 ~]# file /etc/passwd
/etc/passwd: ASCII text
[root@N2 ~]# file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=ceaf496f3aec08afced234f4f36330d3d13a657b, stripped
head
//默认查看前10行
head file……
//指定查看前多少行
head -4 file……
tail
4.15 tail
tail [OPTON]…[FILE]…
-n #:指定获取后#行
-#
-f;跟踪显示文件追加的内容
用这个命令查看新添加的用户是好的
tail –f
可以监视这个文件的变化,当你tail –f FILE
的时候,显示完成后并不会退出,而是一直处于这个文件内,如果哪个用户在这个编辑这个文件的话,显示的这边立刻就会显示。常用于监控日志文件。
cat
-n, --number
cat的意思是连接并显示
-E 是查看文件尾部的连接符,我们linux尾部是$符,而windows尾部是$加上空格,所以linux的文件放到windows上显示往往都是显示一行,而windows的文件放到linux上有进都显示不出来。
-A 是显示出所有的符号
cat –n对文本行编号显示
最好玩的是cat也可以反过来写,反过来写就是倒着显示
有人说cat往往只能查看小文件,其实不然,它是可以翻页的,按着shift+pgdn/pgup。
[root@zhanghe ~]# cat /etc/passwd /etc/shadow /etc/fstab
可以显示多个文件的内容
less
man实际上就是调用的less,用法与man一样,常用。
-N显示行号
G回到文档尾部
1G回到文档首部
使用jK两个键就可以进行行间的查看
其它
date
[root@N2 ~]# date +%Y-%m-%d-%H-%M-%S
2020-02-17-21-14-07
[root@zabbix backup]# date +%F #整体年月日
2017-11-23
[root@zabbix backup]# date +%T #整体时分秒
00:19:48
[root@zabbix backup]# date +%F
2017-11-23
[root@zabbix backup]# date +%Y #仅显示年,小写的Y仅仅显示17,而不显示20
2017
[root@zabbix backup]# date +%m #仅显示月
11
[root@zabbix backup]# date +%d #仅显示日
23
[root@zabbix backup]# date +%T #规律:时分秒皆大写,年月日皆小写
00:26:09
[root@zabbix backup]# date +%H#仅显示时
00
[root@zabbix backup]# date +%M#仅显示分
26
[root@zabbix backup]# date +%S#仅显示秒
21
查看星期:
[root@zabbix ~]# date +%A
Friday
[root@zabbix ~]# date +%a
Fri
更改时间:
[root@zabbix ~]# man date | grep "]]$" #先把格式过滤出来
date [-u|--utc|--universal] [M MDDhhmm[[CC]YY][.ss]]
[root@zabbix ~]# date 080808082008.00 #把系统时间调整为八月八日八时八分二零零八.零零秒
值得注意的是系统一启动的会读取芯片上时间,一旦读取成功,内核会自己模拟一个时钟就不再使用芯片时间,所以由于内核繁忙可能两个时间会不一样。两个时间都不是最精确的,有些公司专门做时间服务。当系统启动之后首先从硬件中读取时间 ,然后就自己模拟时钟进行工作,一般我们winosws的电脑上都有时间服务器,会自动去服务器上对时。
echo
-n禁止自动添加换行符号
-e允许使用转义符
换行
制表符
echo “$VAR_NAME”变量会替换,双引号表弱引用
echo ‘$VAR_NAME’变量不会替换,强引用
[root@N2 ~]# echo -n zh
zh[root@N2 ~]# echo -e "zhanghe
zhangjia zhangweiwei"
zhanghe
zhangjia zhangweiwei
type
内部命令就是shell自带的命令,外部命令是某个路径下的执行程序。
外部命令的执行依赖于PATH变量,这个变量是用户一登陆系统就准备好的,用户的执行的命令都去这个里面寻找。(windows系统中也是有环境变量的)
查看PATH变量:
[root@zhanghe ~]# echo $PATH 3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:
查看命令是内部命令还是外部命令用:type 命令,如果显示某个路径表示是这个外部命令,如果显示“cd is a shell builtin”表示这是个内部命令。
[root@zhanghe ~]# type -a ls
ls is aliased to `ls --color=auto' ls is /bin/ls
[root@zhanghe ~]# type -a cd
cd is a shell builtin
shutdown
shutdown –r 重启
shutdown –h 关机
shutdown –c 取消关机或者重启
TIME:
now: shutdown –r now 现在重启
+m: shutdown –h +3 三分钟以后关机
hh:mm :shutdown –h 08:08 八点八分以后关机
回车
当我们在交互式接口中输入命令回车,意味着告诉交互式接口把我输入的命令所对应的执行程序代码找到,并由其分析后提交给内核并运行起来,运行起来的程序表现为一个或多个进程。
当我们第一次使用某个命令的时候,会从$PATH变量中查找路径,查找到之后变缓存到hash里面,以后再使用这个命令的时候就不会从$PATH变量里面再找了,直接去hash里面查找路径。
当我们第一次使用某个命令的时候,终端会去查找$PATH里面的路径,查找到了之后会缓冲到hash里面,hash可以理解成内存中的一段空间。
hash的优先级是比PATH变量的优先级要高的,如果在hash中的有记录,但是记录错误,真正使用的时候也会报错的,出现这种情况就要清空缓存,help hash,hash –r清除全部缓存。
uname
[root@N2 ~]# uname -r
3.10.0-957.el7.x86_64
[root@N2 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@N2 ~]# uname -a
Linux n9 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@N2 ~]# hostnamectl status
Static hostname: n9
Pretty hostname: N9
Icon name: computer-vm
Chassis: vm
Machine ID: 0b6b6e96ae154bb8a1bc2593538fbefb
Boot ID: 61da47b868d14d78a7fd3f03236484c5
Virtualization: vmware
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-957.el7.x86_64
Architecture: x86-64
which
显示命令对应的程序文件路径
which [OPTION]COMMAND
--skipi-alias禁止显示别名
[root@N2 ~]# which --skip-alias ls
/usr/bin/ls
用户、登录信息
whoami :显示当前登录的有效用户
who;系统当前所有的登录会话
w:系统当前所有的登录会话及所做的操作
[root@N2 ~]# whoami
root
[root@N2 ~]# who
root pts/0 2020-02-17 18:29 (192.168.80.6)
root pts/1 2020-02-17 19:40 (192.168.80.6)
[root@N2 ~]# w
21:05:27 up 8:49, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.80.6 18:29 7.00s 0.27s 0.00s w
root pts/1 192.168.80.6 19:40 1:24m 0.00s 0.00s -bash
可选命令
时间戳
任何文件都由元数据和数据组成,使用stat查看文件的时间戳
三个时间戳:
access time :访问时间,简写atime,读取文件内容
modify time:修改时间,mtime,改变文件内容(数据)
chage time:改变时间,ctime,元数据发生改变(对数据的描述)
touch的主要作用是更改时间戳
用来修改除了改变时间外的另外两个时间,改变时间也会随之改变。
[root@zhanghe tmp]# stat zhang
Access: 2017-06-28 03:59:18.000000000 +0800
Modify: 2017-06-28 03:58:50.000000000 +0800
Change: 2017-06-28 03:58:50.000000000 +0800
[root@zhanghe tmp]# touch -a zhang #只修改访问时间,改变时间不受控制
[root@zhanghe tmp]# stat zhang
Access: 2017-06-28 04:02:34.000000000 +0800
Modify: 2017-06-28 03:58:50.000000000 +0800
Change: 2017-06-28 04:02:34.000000000 +0800
[root@zhanghe tmp]# touch -m zhang #只更新修改时间,同样的改变时间不受控制
[root@zhanghe tmp]# stat zhang
Access: 2017-06-28 04:02:34.000000000 +0800
Modify: 2017-06-28 04:05:08.000000000 +0800
Change: 2017-06-28 04:05:08.000000000 +0800
[root@zhanghe tmp]# touch -m -t 202008080808 zhang
#只把修改时间更新为2020年8月8日8时8分
[root@zhanghe tmp]# stat zhang
Access: 2017-06-28 04:02:34.000000000 +0800
Modify: 2020-08-08 08:08:00.000000000 +0800
Change: 2017-06-28 04:07:47.000000000 +0800
[root@zhanghe tmp]# touch -a -t 202008080802 zhang
#只把访问时间更新为2020年8月8日8时2分
[root@zhanghe tmp]# stat zhang
Access: 2020-08-08 08:02:00.000000000 +0800
Modify: 2020-08-08 08:08:00.000000000 +0800
Change: 2017-06-28 04:11:21.000000000 +0800
hash
hash缓存的作用是:Remember or display program locations. 记住并显示程序的位置。
当我们从shell当中输入一个命令的完,shell会从PATH变量当中的路径去查找没有有相对应的二进制文件,如果没有找到就说输出命令没有找到,如果命令找了之后把这次查找中吸取经验把这个命令从哪里找到的会记到hash当中方便下使用,下次再命令时直接从目的找就可以了就不用去PATH当中挨个查找了,这样提高了工作的效率,忽然发觉,人真的应该向电脑学习。
[root@zhanghe ~]# hash #查看hash表
[root@zhanghe ~]# hash -d cat #删除hash表当中的cat记录
[root@zhanghe ~]# hash –r #清空hash表
history
—a 追加命令历史到历史文件
append history lines from this session to the history file
—c清除历史列表的删除所有条目
clear the history list by deleting all of the entries
—d 6 删除缓存历史中的第六条记录