工作中常用的 Linux 命令

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}'

# 如果只是显示/etc/passwd的账户
$ cat /etc/passwd |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

![图片描述][1]

在以上各个字段中,还可以使用以下特殊字符:

  • 星号(*):代表所有可能的值,例如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

dig 和 nslookup 作用有些类似,都是DNS查询工具。dig,其实是一个缩写,即 Domain Information Groper

查看域名的信息。一般一个域名都会绑定到多个 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

实例:删除当前目录下所有的swp文件

find . -type f -name "*.swp" -delete

实例:定时清理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} #反匹配

实例:-c 统计文件中包含文本的次数

grep -c "text" filename

参考:

gzip

gzip是GNU项目的产物。这个软件下买呢含有下面的工具:

  • gzip :用来压缩文件
  • gzcat:用来查看压缩过的文本文件的内容
  • gunzip:用来解压文件。
gzip xxx
gzip -l <filename> # list compressed file contents

显示前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

任务 旧指令 新指令
使某服务自动启动 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

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命令是给整个目录创建归档文件的简便方法

窍门:下载开源软件之后,经常会看到文件名以.tgz结尾。这些事gzip压缩过的tar文件,可以用tar -zxvf filename.tgz来解压

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

ggggggg
4444444
6666666
michael

<< 变为 <<-。 使用 <<- 的唯一变化就是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

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

xargs 能够将输入数据转化为特定命令的命令行参数;这样,可以配合很多命令来组合使用。比如grep,比如find。

实例:快速修改后缀名字

源文件夹下:

CentOS-base.repo.repo.bak
epel.repo.repo.bak

方法一:

ls *.bak|awk -F. '{print $1}'|xargs -t -i mv {}.repo.repo.bak {}.repo

参考

最后

小伙伴们觉得有用的话,动动手指点个「推荐」吧 😃

欢迎关注

posted @ 2019-02-19 23:14  Michael翔  阅读(732)  评论(0编辑  收藏  举报