awk
示例:
env变量值如下,需要获得pkg_url的链接值:
1 | {"name": "michael", "sex": "male", "pkg_url": "www.github.com", "number": "888"} |
1 | pkg_url=$(echo $env | awk -F "pkg_url\": \"" '{print $2}' | awk -F "\"," '{print $1}') |
-F 指定分隔规则,因为分隔规则中包含了双引号,所以需要用转义符号。
1 | # 格式 |
- awk print函数
- printf+awk完美结合
- AWK 简明教程
- awk 入门教程
basename
basename命令用于打印目录或者文件的基本名称
1 | [root@HGH1000059721 test]# basename a.tar .tar #后缀:可选参数,指定要去除的文件后缀字符串。 |
参考:
- basename
cp
将目录src
复制到dest
目录下,复制好后,dest/src
:
1 | cp -r src dest |
将目录src
下的内容复制到dest
目录下:
1 | cp -r src/* dest |
复制文件,覆盖不询问:
1 | cp -nrf a.txt b.txt |
系统默认给cp
命令设置了别名cp -i
,所以,复制时有冲突需要确认,使用如下方式实现默认覆盖:1
/bin/cp xx yy
参考:
- Linux命令详解之—cp命令
- Linux命令命令大全-cp命令
- Linux 使用 cp 命令强制覆盖功能
curl
发出 Get 请求,服务器返回的内容会在命令行输出:
1 | curl https://www.example.com |
-o
将服务器的回应保存成文件,等同于 wget 命令;-O
将服务器的回应保存成文件,并将 URL 的最后部分当作文件名;-i
显示 HTTP Response 的头信息,连同网页代码一起;-A
指定 User-Agent;-H
添加 HTTP 请求的标头;-d
发送 POST 请求的数据体;-F
用来向服务器上传二进制文件;-k
指定跳过 SSL 检测;-u
指定服务器认证的用户名和密码;-x
指定 HTTP 请求的代理;-X
支持其他动词,比如 POST,发送表单信息,curl -X POST --data "data=xxx" example.com/form.cgi
-v
显示一次 HTTP 通信的整个过程,包括端口连接和 HTTP Request 头信息;
Tips:
- FireFox/Chrome的Dev Tools可以直接把请求复制成 curl 的命令,然后可以直接在 shell 里运行
- Postman 也可以把保存的请求复制成 curl 命令,方便在服务器中调试;
参考:
- 阮一峰 - curl 的用法指南
- 阮一峰 - curl网站开发指南
crontab
1 | # For details see man 4 crontabs |
在以上各个字段中,还可以使用以下特殊字符:
- 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
- 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
- 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
任务执行文件所在位置:1
/var/spool/cron/crontabs
命令参数:
-u
user:用来设定某个用户的crontab服务;
file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入-e
:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。-l
:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。-r
:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。-i
:在删除用户的crontab文件时给确认提示
推荐一个有趣的网站,可以查看 crontab 语法含义:
- https://crontab.guru/
每隔2分钟执行/tmp/test.sh
脚本:1
2crontab -e # 使用crontab -e命令,编辑的是/var/spool/cron下对应用户的 cron 文件
*/2 * * * * /tmp/test.sh
第星期六、星期日的时10分重启smb-也就是每周六、周日:1
10 1 * * 6,0 /etc/init.d/smb restart >> /tmp/run.log 2>&1
实例4:每隔两天的上午8点到11点的第3和第15分钟执行:1
3,15 8-11 */2 * * myCommand
实例5:清理httpd服务日志超过3天的内容:1
0 5 * * * /usr/bin/find /var/log/httpd/ -type f -mtime +3 -exec rm -rf {} \;
实例6:通过正则清理指定文件夹的内容1
2#update-20181122: clean dir +120 days
0 6 * * * find /data/michael -maxdepth 7 -type d -mtime +120 -regextype posix-egrep -regex '.*/[0-9]{2}/[0-9]{6}$' -exec rm -rf {} \;
启动 / 停止 / 重启 crontab
1 | $ /etc/init.d/crond start |
查看日志
1 | $ tail -f /var/log/cron |
参考:
- 如何查看crontab的日志记录
- runoob-Linux Crontab 定时任务
- LinuxTools-crontab 定时任务 推荐
- 每天一个linux命令(50):crontab命令
date
选项:
不加: 显示当前的时间.
-d <字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号;
-s <字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号;
-u:显示GMT;
–help:在线帮助;
–version:显示版本信息。
参数 <+时间日期格式>:指定显示时使用的日期时间格式。
就是格式化字符串处理.当需要用到空格时要使用双引号,如"+%Y-%m-%d %H:%M:%S"
.
一般,%Y %m %d %H %M %S
是最基本的. 使用星期月份时也会用到%a %b
示例1
2
3
4VERSION=$(date +%Y%m%d%H%M%S) #20180410192702 #date后面有空格
time=$(date "+%Y-%m-%d %H:%M:%S") #时间格式中有空格,需要加引号
» date "+%Y-%m-%d %T %a %A"
2018-06-04 11:31:25 Mon Monday
参考:
- Shell中date命令用法
df
通过df
命令很容易发现那个磁盘的存储空间快没了。查看挂载状态和硬盘使用量信息:1
df -hT
dig
dig 和 nslookup 作用有些类似,都是DNS查询工具。dig,其实是一个缩写,即 Domain Information Groper
。
查看域名的信息。一般一个域名都会绑定到多个 IP 上,ping 命令只能一次看到一个 ip,这个可以看到域名解析的信息。1
dig baidu.com
可能机器上没有这个命令,可以如下方式安装:1
yum install -y bind-utils
参考:
- 《dig挖出DNS的秘密》-linux命令五分钟系列之三十四 Linux 大棚
- xindoo-csdn-我常用的一些linux命令
du
du
命令可以显示某个特定目录(默认情况下是当前目录)的磁盘使用情况。这一方法可以判断系统上某个目录下是不是有超大的文件。
查看当前文件夹的文件大小:1
2du -sh *
du -sh /usr/* | sort -rn # 按M大小排序
env
查看环境变量值,例:
查看带有SVN的环境变量值:1
env|grep SVN
find
实例:定时清理httpd服务日志超过3天的内容:
1 | 0 5 * * * /usr/bin/find /var/log/httpd/ -type f -mtime +3 -exec rm -rf {} \; |
实例: 通过正则清理指定文件夹的内容1
2#update-20181122: clean dir +120 days
0 6 * * * find /data/michael -maxdepth 7 -type d -mtime +120 -regextype posix-egrep -regex '.*/[0-9]{2}/[0-9]{6}$' -exec rm -rf {} \;
实例:搜索/etc目录下第一层的conf配置文件,文件夹下层的不需要1
find /etc/ -maxdepth 1 -name "*.conf" # 最好加上引号
实例:只搜索当前目录,但是不包括.git目录,统计目录数1
find . -maxdepth 1 -mindepth 1 -type d | grep -v .git |wc -l
实例:仅列出目录1
find . -type d -maxdepth 1
参考:
- Linux中find常见用法示例
- FIND中正则表达式的使用
-Linux中find命令基本使用方法
fdisk
fdisk -l
看到目前系统中所有分区的信息
https://blog.csdn.net/cc_net/article/details/2894510
free
free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。在Linux系统监控的工具中,free命令是最经常使用的命令之一。
1 | free -h -s 2 -t |
-h
单位会更人性化-s
每2秒,显示内存使用信息-t
显示内存总和
1 | # 结果 |
- total:总计物理内存的大小。
- used:已使用多大。
- free:可用有多少。
- Shared:多个进程共享的内存总额。
- Buffers/cached:磁盘缓存的大小
- 交换分区SWAP,也就是我们通常所说的虚拟内存
从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached 是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached 会很快地被回收。
所以从应用程序的角度来说 可用内存=系统free memory+buffers+cached
我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux看内存是否够用的标准.
+buffers/cache,即对应用程序来说free的内存太少了,也是该考虑优化程序或加内存了
参考:
- 每天一个linux命令(45):free 命令
fuser
fuser通常被用在诊断系统的“resource busy”问题,通常是在你希望umount指定的挂载点得时候遇到。 如果你希望kill所有正在使用某一指定的file, file system or sockets的进程的时候,你可以使用 -k option
1 | fuser –k –i /path/to/your/filename # 加上-i 表示杀死之前,需确认 |
- fuser命令
- fuser 命令小结
groups
1 | whoami # 查看用户名 |
grep
语法:1
grep [options] pattern [file]
1 | 递归、显示行号、忽略大小写、显示搜到的匹配内容上下2行 搜索范围是当前目录下 |
1 | grep 'shopbase' /home/admin -r -n --include *.{vm,java} #指定文件后缀 |
参考:
- man-grep
- Linux查找文件内容(grep)
- 每天一个linux命令(39):grep 命令
- 我的java问题排查工具单
gzip
gzip是GNU项目的产物。这个软件下买呢含有下面的工具:
- gzip :用来压缩文件
- gzcat:用来查看压缩过的文本文件的内容
- gunzip:用来解压文件。
1 | gzip xxx |
head
显示前n行内容:
1 | head -n |
https://www.linuxdaxue.com/linux-command-intro-head.html
less
在more
的时候,我们并没有办法向前面翻,只能往后面看,但若使用了less
时,就可以使用 [pageup] [pagedown]
等按键的功能来往前往后翻看文件。
locate
1 | locate GPG-KEY |
可能系统没有自带locate
命令,可以使用yum install mlocate -y
安装,安装结束执行updatedb
命令。
ls
仅显示目录:
1 | ll -d |
ls命令显示文件大小,会根据文件大小自己决定单位,M或者Kb或者G
1 | ll -h |
mount
mount
可以显示全部挂载情况。
将分区挂载到目录:
1 | mount /dev/xvde /data |
- Linux mount命令
mkdir
mkdir sysadmin/admim_{1,2,3,4,5}
参考:
- 在Linux中用chattr和lsattr命令管理文件和目录属性
netstat
检查端口占用
1 | netstat -anp|grep 80 |
- linux(redhat,centos)释放被占用端口
ping
ping baidu.com
- 生活在宁静的角落——PING命令的各类反馈信息
rm
只删除当前文件夹下的隐藏文件和隐藏文件夹:1
rm -rf .*
https://blog.csdn.net/ficksong/article/details/52447729
rpm
我的系统中安装了那些rpm软件包1
rpm -qa
如果要查找所有安装过的包含某个字符串sql的软件包1
rpm -qa | grep sql
一个rpm包中的文件安装到那里去了?1
rpm -ql 包名
软件包的卸载1
rpm -e
参考:http://man.linuxde.net/rpm
rpm2cpio
RPM 包解压缩:1
2# 注意,要加上 cpio -div,否则终端会打印多余的内容出来
rpm2cpio xxxx.rpm | cpio -div
你的 Linux 下可能没有rpm2cpio这个命令,用过简单指令安装即可:
1 | sudo apt-get install rpm2cpio |
sed
eg1:截取日志中的两行之间的内容,同时去掉匹配的首尾行:1
cat mock.log |sed -n '/tee/,/find/p' mock.log|sed -n '1!p'|sed -n '$!p'|awk '{print $2,$3}'
eg2:1
nl passwd|sed "1d;10d" #删除第1行,第10行
eg3:1
2sed -i -e "1i%define upstream_version $UPSTREAMVERSION\\" *.spec #第一行插入
sed -i -e "s/UPSTREAMVERSION/$UPSTREAMVERSION/g" *.spec #替换
参考:
- SED 简明教程
- sed、awk——运维必须掌握的两个工具
- 看例子学sed
- 三十分钟学会SED
- sed命令筛选指定字符串之间的行
SELinux
1 | sestatus [-v] # 查看selinux开启状态 |
selinux开启常常影响其他一些服务,比如httpd等,所以,运维往往一般拿到机器就会默认将其关闭。
1 | setenforce 1 # 设置SELinux 成为enforcing模式 |
开机重启后,上面利用setenforce
方式修改的值会失效,所以,开机重启也有效的话,需要修改如下文件:
1 | /etc/selinux/config # 文件的软链接是/etc/sysconfig/selinux 是 |
- wiki-SELinux
- Linux 下为何要关闭 SELinux?
- 如何开启或关闭SELinux
- SELinux开启与关闭各参数说明
sort
对之前提到的密码文件/etc/passwd
根据用户ID进行数值排序。-k
和-t
参数在对安字段分割的数据进行排序时非常有用。
1 | sort -t ":" -k 3 -n /etc/passwd |
systemctl
任务 | 旧指令 | 新指令 |
---|---|---|
使某服务自动启动 | chkconfig –level 3 httpd on | systemctl enable httpd.service |
使某服务不自动启动 | chkconfig –level 3 httpd off | systemctl disable httpd.service |
检查服务状态 | service httpd status | systemctl status httpd.service |
显示所有已启动的服务 | chkconfig –list | systemctl list-units –type=service |
启动某服务 | service httpd start | systemctl start httpd.service |
停止某服务 | service httpd stop | systemctl stop httpd.service |
重启某服务 | service httpd restart | systemctl restart httpd.service |
- Linux 设置程序开机自启动 (命令systemctl 和 chkconfig用法区别比较)
sha256sum
生成文件对应的sha256值:
1 | sha256sum FusionSphere_Upgrade_6.2.50.4001.tar.gz > a.sha256sum # 校验 |
参考:
- linux下生成sha256校验文件、使用sha256校验某个文件
tar
目前Unix和Linux上最广泛使用的归档工具是 tar 命令。
1 | tar function [options] object1 object2 …… |
首先,创建一个归档文件:
1 | tar -cvf test.tar test/ test2/ |
创建了名为test.tar归档文件,含有 test 和 test2 目录内容。
接着,列出 tar 文件 test.tar 内容(但并不提取文件):
1 | tar -tf test.tar |
最后用命令提取文件:
1 | tar -xvzf test.tar |
tar命令是给整个目录创建归档文件的简便方法
窍门:下载开源软件之后,经常会看到文件名以.tgz结尾。这些事gzip压缩过的tar文件,可以用tar -zxvf filename.tgz来解压
tee
tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。简单的说就是把数据重定向到给定文件和屏幕上。
eg1 在终端打印stdout同时重定向到文件中:
1 | ls | tee out.txt | cat -n |
eg2 创建daemon.json文件,EOF之间内容作为stdin:
1 | tee /etc/docker/daemon.json << EOF |
<< EOF …… EOF
的作用是在命令执行过程中用户自定义输入,它类似于起到一个临时文件的作用,只是比使用文件更方便灵活。
EOF妙用:
它的作用就是将两个delimiter
之间的内容(Here Document Content 部分) 传递给cmd
作为输入参数。
1 | cmd << delimiter |
1 | [root@ecs-6b86 tmp]# cat << EOF >tt.sh |
自定义EOF,比如自定义为michael
[root@slave-server opt]# cat << michael > haha.txt
ggggggg
4444444
6666666
michael
<<
变为 <<-
。 使用 <<-
的唯一变化就是Here Document 的内容部分每行前面的 tab
(制表符)将会被删除掉,这种用法是为了编写Here Document的时候可以将内容部分进行缩进,方便阅读代码。
有时脚本内容里变量不想被系统环境变量替换掉,可以通过在起始的 delimiter的前后添加 “ 来实现
参考:
- linux shell 的here document 用法 (cat << EOF)
- EOF是什么?
- linux shell脚本EOF妙用
tree
1 | tree -FCL 2 FusionUpgrade |
- linux tree命令–显示目录的树形结构
time
1 | time nslookup michael.com |
- time
test
- 判断字符串是否为空,可以通过
help test
查看
1 | -z STRING True if string is empty. |
示例:
1 | #!/bin/sh |
- linux shell 中判断字符串为空的正确方法:有趣的示例,强调了需要加引号的重要性
- Linux shell 编程 字符串null值 的 条件判断?:解释了,为何加引号,bash的内建命令test在只有一个参数的情况下,只要参数不为空就返回真
tcpdump
首先,先用 tcpdump -D
命令列出可以抓包的网络接口:
1 | tcpdump -D |
其中, lo
就是 localhost
。其中特殊接口 any 可用于抓取所有活动的网络接口的数据包。
1 | $ sudo tcpdump -i any -c5 -nn icmp port 80 -A -w webserver.pcap |
-c
选项可以用于限制 tcpdump 抓包的数量- 用
-n
选项显示 IP 地址,-nn
选项显示端口号 icmp
这里用作过滤条件,只要抓取ICMP
报文port
指定端口号,根据端口号来筛选数据包- tcpdump 提供了两个选项可以查看数据包内容,
-X
以十六进制打印出数据报文内容,-A
打印数据报文的 ASCII 值 - 使用
-w
选项来保存数据包而不是在屏幕上显示出抓取的数据包
tcpdump 将数据包保存在二进制文件中,所以不能简单的用文本编辑器去打开它。使用 -r
选项参数来阅读该文件中的报文内容:1
tcpdump -nn -r webserver.pcap
用 host 参数只抓取和特定主机相关的数据包:1
sudo tcpdump -i any -c5 -nn host 54.204.39.132
可以使用括号来创建更为复杂的过滤规则,但在 shell 中请用引号包含你的过滤规则以防止被识别为 shell 表达式:1
$ sudo tcpdump -i any -c5 -nn "port 80 and (src 192.168.122.98 or src 54.204.39.132)"
src
抓取源 IP 地址- 使用
dst
就是按目的 IP/主机名来筛选数据包 - 使用
and
以及or
逻辑操作符来创建过滤规则
参考:
- 伯乐在线-在 Linux 命令行中使用 tcpdump 抓包
- 运维之路-NAS存储抓包分析
- Huang-tcpdump 常用操作
- Tcpdump入门教程示例
- 9个tcpdump使用实例
top
top 命令是 Linux 下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况。
load average: 0.02, 0.04, 0.00
: 系统1分钟、5分钟、15分钟的CPU负载信息
top 默认按 cpu 占用排序,这也是可以修改的,按 F(大写)即可选择相应排序,之后任意键退出即可。
进程信息:
- PID:进程的ID
- USER:进程所有者
- PR:进程的优先级别,越小越优先被执行
- NInice:值
- VIRT:进程占用的虚拟内存
- RES:进程占用的物理内存
- SHR:进程使用的共享内存
- S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
- %CPU:进程占用CPU的使用率
- %MEM:进程使用的物理内存和总内存的百分比
- TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
- COMMAND:进程启动命令名称
交互操作:
- c:显示进程命令的全路径与参数
- f:可以指定top显示的内容,如ppid、swap等都可以选择显示
- k:输入k之后可以kill掉指定的进程
- A:分类显示各种系统资源高的进程。可用于快速识别系统上的性能要求极高的任务,推荐使用
- h:获取top的命令帮助
- H:显示线程,默认只显示进程
- W[大写]:将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法
参考:
- Top实践小技巧
useradd/groupadd
Linux 系统的用户、群组添加、管理
1 | 添加一个用户为 michael,属于基本组(主组) root。如果不加 -g,则默认会属于和用户名同名的主组 |
参考:
- 博客园-Linux用户和组管理,添加修改用户,添加修改组,加入组,移除组
unzip
1 | unzip -l demo1-0.1-py2.7.egg |
1 | unzip -o -d /home/sunny myfile.zip |
把myfile.zip文件解压到 /home/sunny/
-o
:不提示的情况下覆盖文件;-d
:-d /home/sunny 指明将文件解压缩到/home/sunny目录下;
参考:
- Linux下的压缩(zip)解压(unzip)缩命令
- unzip命令
wc
1 | wc [-clw][--help][--version][文件...] |
参数:1
2
3
4
5-c或--bytes或--chars 只显示Bytes数。
-l或--lines 只显示行数。
-w或--words 只显示字数。
--help 在线帮助。
--version 显示版本信息。
who
who //显示当前登录系统的用户
显示标题栏1
# who -H
只显示当前用户1
# who -m -H
wget
将远程目录下的全部内容下载到save目录下
。-nd
参数表示,如果远程目录下也有子目录,会将子目录中的文件下载下来而不创建多余目录。
1 | wget -r -np -nd -R "index.html*" -P test http://xxx/FusionUpgrade/master/euler/20181101130551/ # 注意,URL末尾需要有/,否则会递归下载的 |
- -r:递归下载,下载指定网页某一目录下(包括子目录)的所有文件
- -nd:–-no-directories 不创建目录
- -np:–-no-parent 不要追溯到父目录
- P:指定下载下来的存放目录,没有会自动创建
- -nH:–-no-host-directories 不创建主机目录
示例2:
将远程文件夹原封不动下载下来,并且下载下来的本地路径也是远程目录,而不会创建多级目录。-nH
表示不会创建xxx.com
目录,--cut-dirs
将其余多余层级目录不下载,实现效果下载到本地就只是DLRN_RPMS
目录。
1 | wget -r -p -k -np -nH --cut-dirs=4 http://xxx.com/cps/FusionNetwork-for-fc/master/suse/DLRN_RPMS/ |
参考:
- wget 文件下载
- wget
- wget递归下载文件
watch
1 | watch -d 'ls -l|grep scf' # 监测当前目录中 scf' 的文件的变化 |
参考:
- watch-命令
systemd service服务
- Systemd 入门教程:命令篇
xargs
为了快速修改后缀名字
源文件夹下:
1 | CentOS-base.repo.repo.bak |
方法一:
1 | ls *.bak|awk -F. '{print $1}'|xargs -t -i mv {}.repo.repo.bak {}.repo |
参考:
- 阮一峰——xargs 命令教程