目录
awk
示例:
env变量值如下,需要获得pkg_url的链接值:
{"name": "michael", "sex": "male", "pkg_url": "www.github.com", "number": "888"}
pkg_url=$(echo $env | awk -F "pkg_url\": \"" '{print $2}' | awk -F "\"," '{print $1}')
echo $pkg_url
www.github.com
-F 指定分隔规则,因为分隔规则中包含了双引号,所以需要用转义符号。
# 格式
$ awk 动作 文件名
# 示例
$ awk '{print $0}' demo.txt
echo 'hello:michael:xiang'|awk -F ':' '{print $1}'
## basename
basename命令用于打印目录或者文件的基本名称
[root@HGH1000059721 test]# basename a.tar .tar #后缀:可选参数,指定要去除的文件后缀字符串。
a
[root@HGH1000059721 test]# basename /tmp/test/a.tar #不带后缀,获取文件名
a.tar
参考:
cp
将目录src
复制到dest
目录下,复制好后,dest/src
:
cp -r src dest
将目录src
下的内容复制到dest
目录下:
cp -r src/* dest
复制文件,覆盖不询问:
cp -nrf a.txt b.txt
系统默认给cp
命令设置了别名cp -i
,所以,复制时有冲突需要确认,使用如下方式即可不改变别名,也实现默认覆盖:
/bin/cp xx yy
参考:
crontab
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
在以上各个字段中,还可以使用以下特殊字符:
- 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
- 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
- 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
任务执行文件所在位置:
/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文件时给确认提示
每隔2分钟执行/tmp/test.sh
脚本:
crontab -e # 使用crontab -e命令,编辑的是/var/spool/cron下对应用户的 cron 文件
*/2 * * * * /tmp/test.sh
第星期六、星期日的时10分重启smb-也就是每周六、周日:
10 1 * * 6,0 /etc/init.d/smb restart >> /tmp/run.log 2>&1
实例4:每隔两天的上午8点到11点的第3和第15分钟执行:
3,15 8-11 */2 * * myCommand
实例5:清理httpd服务日志超过3天的内容:
0 5 * * * /usr/bin/find /var/log/httpd/ -type f -mtime +3 -exec rm -rf {} \;
实例6:通过正则清理指定文件夹的内容
#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
$ /etc/init.d/crond start
$ /etc/init.d/crond stop
$ /etc/init.d/crond restart
查看日志
$ tail -f /var/log/cron
参考:
date
选项:
不加: 显示当前的时间.
-d :显示字符串所指的日期与时间。字符串前后必须加上双引号;
-s :根据字符串来设置日期与时间。字符串前后必须加上双引号;
-u:显示GMT;
--help:在线帮助;
--version:显示版本信息。
参数 <+时间日期格式>:指定显示时使用的日期时间格式。
就是格式化字符串处理.当需要用到空格时要使用双引号,如"+%Y-%m-%d %H:%M:%S"
.
一般,%Y %m %d %H %M %S
是最基本的. 使用星期月份时也会用到%a %b
示例
VERSION=$(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
参考:
df
通过df
命令很容易发现那个磁盘的存储空间快没了。查看挂载状态和硬盘使用量信息:
df -hT
dig
查看域名的信息。一般一个域名都会绑定到多个 IP 上,ping 命令只能一次看到一个 ip,这个可以看到域名解析的信息
dig baidu.com
可能机器上没有这个命令,可以如下方式安装:
yum install -y bind-utils
参考:
du
du
命令可以显示某个特定目录(默认情况下是当前目录)的磁盘使用情况。这一方法可以判断系统上某个目录下是不是有超大的文件。
查看当前文件夹的文件大小:
du -sh *
du -sh /usr/* | sort -rn # 按M大小排序
env
查看环境变量值,例:
查看带有SVN的环境变量值:
env|grep SVN
find
实例:定时清理httpd服务日志超过3天的内容:
0 5 * * * /usr/bin/find /var/log/httpd/ -type f -mtime +3 -exec rm -rf {} \;
实例: 通过正则清理指定文件夹的内容
#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配置文件,文件夹下层的不需要
find /etc/ -maxdepth 1 -name "*.conf" # 最好加上引号
实例:只搜索当前目录,但是不包括.git目录,统计目录数
find . -maxdepth 1 -mindepth 1 -type d | grep -v .git |wc -l
实例:仅列出目录
find . -type d -maxdepth 1
参考:
fdisk
fdisk -l
看到目前系统中所有分区的信息
https://blog.csdn.net/cc_net/article/details/2894510
free
free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。在Linux系统监控的工具中,free命令是最经常使用的命令之一。
free -h -s 2 -t
-h
单位会更人性化-s
每2秒,显示内存使用信息-t
显示内存总和
# 结果
total used free shared buff/cache available
Mem: 7.6G 935M 6.1G 9.7M 631M 6.4G
Swap: 7.5G 0B 7.5G
Total: 15G 935M 13G
- total:总计物理内存的大小。
- used:已使用多大。
- free:可用有多少。
- Shared:多个进程共享的内存总额。
- Buffers/cached:磁盘缓存的大小
- 交换分区SWAP,也就是我们通常所说的虚拟内存
从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached 是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached 会很快地被回收。
所以从应用程序的角度来说 可用内存=系统free memory+buffers+cached
我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux看内存是否够用的标准.
+buffers/cache,即对应用程序来说free的内存太少了,也是该考虑优化程序或加内存了
参考:
fuser
fuser通常被用在诊断系统的“resource busy”问题,通常是在你希望umount指定的挂载点得时候遇到。 如果你希望kill所有正在使用某一指定的file, file system or sockets的进程的时候,你可以使用-k option
fuser –k –i /path/to/your/filename # 加上-i 表示杀死之前,需确认
groups
whoami # 查看用户名
groups # 查看当前用户所属组
grep
语法:
grep [options] pattern [file]
# 递归、显示行号、忽略大小写、显示搜到的匹配内容上下2行 搜索范围是当前目录下
grep -rni 'github.com' -C 2 .
grep 'shopbase' /home/admin -r -n --include *.{vm,java} #指定文件后缀
grep 'shopbase' /home/admin -r -n --exclude *.{vm,java} #反匹配
参考:
gzip
gzip是GNU项目的产物。这个软件下买呢含有下面的工具:
- gzip :用来压缩文件
- gzcat:用来查看压缩过的文本文件的内容
- gunzip:用来解压文件。
gzip xxx
gzip -l <filename> # list compressed file contents
head
显示前n行内容:
head -n
https://www.linuxdaxue.com/linux-command-intro-head.html
less
在more
的时候,我们并没有办法向前面翻,只能往后面看,但若使用了less
时,就可以使用 [pageup] [pagedown]
等按键的功能来往前往后翻看文件。
locate
locate GPG-KEY
# find /etc -name '*GPG-KEY*' 等同
可能系统没有自带locate
命令,可以使用yum install mlocate -y
安装,安装结束执行updatedb
命令。
ls
仅显示目录:
ll -d
ls命令显示文件大小,会根据文件大小自己决定单位,M或者Kb或者G
ll -h
mount
mount
可以显示全部挂载情况。
将分区挂载到目录:
mount /dev/xvde /data
mkdir
mkdir sysadmin/admim_{1,2,3,4,5}
参考:
netstat
检查端口占用
netstat -anp|grep 80
rm
只删除当前文件夹下的隐藏文件和隐藏文件夹:
rm -rf .*
https://blog.csdn.net/ficksong/article/details/52447729
rpm
我的系统中安装了那些rpm软件包
rpm -qa
如果要查找所有安装过的包含某个字符串sql的软件包
rpm -qa | grep sql
一个rpm包中的文件安装到那里去了?
rpm -ql 包名
软件包的卸载
rpm -e
参考:http://man.linuxde.net/rpm
rpm2cpio
RPM 包解压缩:
# 注意,要加上 cpio -div,否则终端会打印多余的内容出来
rpm2cpio xxxx.rpm | cpio -div
你的 Linux 下可能没有rpm2cpio这个命令,用过简单指令安装即可:
sudo apt-get install rpm2cpio
sudo yum install rpm2cpio
sed
eg1:截取日志中的两行之间的内容,同时去掉匹配的首尾行:
cat mock.log |sed -n '/tee/,/find/p' mock.log|sed -n '1!p'|sed -n '$!p'|awk '{print $2,$3}'
eg2:
nl passwd|sed "1d;10d" #删除第1行,第10行
eg3:
sed -i -e "1i%define upstream_version $UPSTREAMVERSION\\" *.spec #第一行插入
sed -i -e "s/UPSTREAMVERSION/$UPSTREAMVERSION/g" *.spec #替换
参考:
SELinux
sestatus [-v] # 查看selinux开启状态
getenforce # 查看当前selinux的状态
selinux开启常常影响其他一些服务,比如httpd等,所以,运维往往一般拿到机器就会默认将其关闭。
setenforce 1 # 设置SELinux 成为enforcing模式
setenforce 0 # 设置SELinux 成为permissive模式 不重启关闭selinux的解决办法
开机重启后,上面利用setenforce
方式修改的值会失效,所以,开机重启也有效的话,需要修改如下文件:
/etc/selinux/config # 文件的软链接是/etc/sysconfig/selinux 是
sort
对之前提到的密码文件/etc/passwd
根据用户ID进行数值排序。-k
和-t
参数在对安字段分割的数据进行排序时非常有用。
sort -t ":" -k 3 -n /etc/passwd
systemctl
sha256sum
生成文件对应的sha256值:
sha256sum FusionSphere_Upgrade_6.2.50.4001.tar.gz > a.sha256sum # 校验
sha256sum -c <(grep FusionSphere_Upgrade_6.2.50.4001.tar.gz a.sha256sum) # 校验
参考:
tar
目前Unix和Linux上最广泛使用的归档工具是 tar 命令。
tar function [options] object1 object2 ……
首先,创建一个归档文件:
tar -cvf test.tar test/ test2/
创建了名为test.tar归档文件,含有 test 和 test2 目录内容。
接着,列出 tar 文件 test.tar 内容(但并不提取文件):
tar -tf test.tar
最后用命令提取文件:
tar -xvzf test.tar
tar命令是给整个目录创建归档文件的简便方法
tee
tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。简单的说就是把数据重定向到给定文件和屏幕上。
eg1 在终端打印stdout同时重定向到文件中:
ls | tee out.txt | cat -n
eg2 创建daemon.json文件,EOF之间内容作为stdin:
tee /etc/docker/daemon.json << EOF
{
"insecure-registries" : [ "", ""]
}
EOF
<< EOF …… EOF
的作用是在命令执行过程中用户自定义输入,它类似于起到一个临时文件的作用,只是比使用文件更方便灵活。
EOF妙用:
它的作用就是将两个delimiter
之间的内容(Here Document Content 部分) 传递给cmd
作为输入参数。
cmd << delimiter
Here Document Content
delimiter
[root@ecs-6b86 tmp]# cat << EOF >tt.sh
123123123
345345
asdfasds
EOF
自定义EOF,比如自定义为michael
[root@slave-server opt]# cat << michael > haha.txt
<<
变为 <<-
。 使用 <<-
的唯一变化就是Here Document 的内容部分每行前面的 tab
(制表符)将会被删除掉,这种用法是为了编写Here Document的时候可以将内容部分进行缩进,方便阅读代码。
有时脚本内容里变量不想被系统环境变量替换掉,可以通过在起始的 delimiter的前后添加 " 来实现
参考:
tree
tree -FCL 2 FusionUpgrade
time
time nslookup michael.com
nslookup: can't resolve '(null)': Name does not resolve
Name: micahel.com
Address 1: 10.248.250.158
real 0m 5.00s
user 0m 0.00s
sys 0m 0.00s
test
- 判断字符串是否为空,可以通过
help test
查看
-z STRING True if string is empty.
-n STRING
STRING True if string is not empty.
示例:
#!/bin/sh
STRING=""
# -z
if [ -z "$STRING" ]; then
echo "STRING is empty"
fi
if [ -n "$STRING" ]; then
echo "STRING is not empty"
fi
# STRING is empty
- linux shell 中判断字符串为空的正确方法:有趣的示例,强调了需要加引号的重要性
- Linux shell 编程 字符串null值 的 条件判断?:解释了,为何加引号,bash的内建命令test在只有一个参数的情况下,只要参数不为空就返回真
tcpdump
首先,先用 tcpdump -D
命令列出可以抓包的网络接口:
$ tcpdump -D
1.virbr0
2.docker0
3.bluetooth0 (Bluetooth adapter number 0)
4.nflog (Linux netfilter log (NFLOG) interface)
5.nfqueue (Linux netfilter queue (NFQUEUE) interface)
6.usbmon1 (USB bus number 1)
7.usbmon2 (USB bus number 2)
8.wlp3s0
9.enp5s0
10.any (Pseudo-device that captures on all interfaces)
11.lo [Loopback]
其中, lo
就是 localhost
。其中特殊接口 any 可用于抓取所有活动的网络接口的数据包。
$ sudo tcpdump -i any -c5 -nn icmp port 80 -A -w webserver.pcap
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
22:10:51.809330 IP 192.168.3.43.22 > 192.168.3.66.50051: Flags [P.], seq 2040167007:2040167203, ack 59350146, win 1432, options [nop,nop,TS val 89942170 ecr 111122685], length 196
22:10:51.812472 IP 192.168.3.43.22 > 192.168.3.66.50051: Flags [P.], seq 196:416, ack 1, win 1432, options [nop,nop,TS val 89942173 ecr 111122685], length 220
22:10:51.833093 IP 192.168.3.66.50051 > 192.168.3.43.22: Flags [.], ack 0, win 23490, options [nop,nop,TS val 111123121 ecr 89942122], length 0
22:10:51.833193 IP 192.168.3.43.22 > 192.168.3.66.50051: Flags [P.], seq 416:612, ack 1, win 1432, options [nop,nop,TS val 89942194 ecr 111123121], length 196
22:10:51.835541 IP 192.168.3.66.50051 > 192.168.3.43.22: Flags [.], ack 196, win 23487, options [nop,nop,TS val 111123121 ecr 89942170], length 0
5 packets captured
7 packets received by filter
0 packets dropped by kernel
-c
选项可以用于限制 tcpdump 抓包的数量- 用
-n
选项显示 IP 地址,-nn
选项显示端口号 icmp
这里用作过滤条件,只要抓取ICMP
报文port
指定端口号,根据端口号来筛选数据包- tcpdump 提供了两个选项可以查看数据包内容,
-X
以十六进制打印出数据报文内容,-A
打印数据报文的 ASCII 值 - 使用
-w
选项来保存数据包而不是在屏幕上显示出抓取的数据包
tcpdump 将数据包保存在二进制文件中,所以不能简单的用文本编辑器去打开它。使用 -r
选项参数来阅读该文件中的报文内容:
tcpdump -nn -r webserver.pcap
用 host 参数只抓取和特定主机相关的数据包:
sudo tcpdump -i any -c5 -nn host 54.204.39.132
可以使用括号来创建更为复杂的过滤规则,但在 shell 中请用引号包含你的过滤规则以防止被识别为 shell 表达式:
$ 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
逻辑操作符来创建过滤规则
参考:
unzip
unzip -l demo1-0.1-py2.7.egg
unzip -o -d /home/sunny myfile.zip
把myfile.zip文件解压到 /home/sunny/
-o
:不提示的情况下覆盖文件;-d
:-d /home/sunny 指明将文件解压缩到/home/sunny目录下;
参考:
wc
wc [-clw][--help][--version][文件...]
参数:
-c或--bytes或--chars 只显示Bytes数。
-l或--lines 只显示行数。
-w或--words 只显示字数。
--help 在线帮助。
--version 显示版本信息。
who
who //显示当前登录系统的用户
显示标题栏
# who -H
只显示当前用户
# who -m -H
wget
将远程目录下的全部内容下载到save目录下
。-nd
参数表示,如果远程目录下也有子目录,会将子目录中的文件下载下来而不创建多余目录。
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
目录。
wget -r -p -k -np -nH --cut-dirs=4 http://xxx.com/cps/FusionNetwork-for-fc/master/suse/DLRN_RPMS/
参考:
watch
watch -d 'ls -l|grep scf' # 监测当前目录中 scf' 的文件的变化
watch -n 10 'cat /proc/loadavg' # 10秒一次输出系统的平均负载
watch -n 1 -d netstat -ant # 命令:每隔一秒高亮显示网络链接数的变化情况
参考:
systemd service服务
xargs
为了快速修改后缀名字
源文件夹下:
CentOS-base.repo.repo.bak
epel.repo.repo.bak
方法一:
ls *.bak|awk -F. '{print $1}'|xargs -t -i mv {}.repo.repo.bak {}.repo
小伙伴们觉得有用的话,动动手指点个「推荐」吧 :)