博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
工作中常用的 Linux 命令
阅读量:7042 次
发布时间:2019-06-28

本文共 12914 字,大约阅读时间需要 43 分钟。

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 days0 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

参考:

  • Linux 大棚

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 days0 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   availableMem:           7.6G        935M        6.1G        9.7M        631M        6.4GSwap:          7.5G          0B        7.5GTotal:          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 xxxgzip -l 
# 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  rpm2cpiosudo 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 Contentdelimiter
[root@ecs-6b86 tmp]# cat << EOF >tt.sh123123123345345asdfasdsEOF

自定义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.comnslookup: can't resolve '(null)': Name does not resolveName:      micahel.comAddress 1: 10.248.250.158real    0m 5.00suser    0m 0.00ssys     0m 0.00s

test

  • 判断字符串是否为空,可以通过help test查看
-z STRING      True if string is empty.          -n STRING         STRING      True if string is not empty.

示例:

#!/bin/shSTRING=""# -z if [ -z "$STRING" ]; then     echo "STRING is empty" fiif [ -n "$STRING" ]; then     echo "STRING is not empty" fi# STRING is empty
  • :有趣的示例,强调了需要加引号的重要性
  • :解释了,为何加引号,bash的内建命令test在只有一个参数的情况下,只要参数不为空就返回真

tcpdump

首先,先用 tcpdump -D 命令列出可以抓包的网络接口:

$ tcpdump -D1.virbr02.docker03.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.wlp3s09.enp5s010.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.pcaptcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes22: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 19622: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 22022: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 022: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 19622: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 05 packets captured7 packets received by filter0 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.bakepel.repo.repo.bak

方法一:

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

参考

最后

  • 本文作者: Michael翔
  • 本文链接: https://michael728.github.io/2018/07/05/linux-useful-commands-in-work/

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

转载于:https://www.cnblogs.com/michael-xiang/p/10404016.html

你可能感兴趣的文章
java.lang.InstantiationException:
查看>>
转:jmf編譯問題的解決
查看>>
Hosts文件的位置
查看>>
java设计模式演示样例
查看>>
Codeforces Round #345 (Div. 2) D. Image Preview 暴力 二分
查看>>
suggest
查看>>
Java集合框架实现自定义排序
查看>>
数组添加:如何往数组的"null"位置插入数据呢?
查看>>
Number of Parallelograms(求平行四边形个数)
查看>>
转:基于TLS1.3的微信安全通信协议mmtls介绍
查看>>
ImageNet && 医学图像的识别
查看>>
HBase编程 API入门系列之delete(客户端而言)(3)
查看>>
Cocos2dx使用wxsqlite开源加密SQLite3数据库
查看>>
JMeter学习-内存溢出解决方法
查看>>
磨刀不误砍柴工——VS生成事件
查看>>
XE7 update1
查看>>
Omi 树组件 omi-tree 编写指南
查看>>
Kubernetes 准入控制 Admission Controller 介绍
查看>>
Kotlin协程快速入门
查看>>
AudioKit 入门教程
查看>>