被公司前辈指点了下,说了下常用的一些东西,下面说说一些Linux命令,虽然我都见过,知道大概是干啥的,但是一些确实不太会用。
df和du
df:列出文件系统的整体使用量
du: 查看文件系统的磁盘使用量(常用在查看目录所占磁盘空间)
df:
-a 列出所有的文件系统,包括系统特有的/proc
-k 以kb的容量显示各文件系统
-m 以m的容量显示各文件系统
-h 以人们较易阅读的GBytes,Mbytes,KBytes等格式自行显示
-H 以M=1000k替换M=1024K的进位方式
-T 连同该硬盘分区的文件系统名称也列出
-i 不用磁盘容量,而以inode的数量来显示
df 不加任何选项,那么默认会将系统内所有的都以1kb的容量列出来。
Filestem: 代表文件系统在哪个磁盘分区,所以列出设备名名称
1k-blocks: 说明下面的数字单位是1kb,可利用-h或-m来改变容量
Used: 用掉的磁盘空间
Ava:剩下的磁盘空间
Use% 磁盘使用率
Mounted: 磁盘挂载点
[root@iz2zeczv3xrnm2jx6aayhxz ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 930480 0 930480 0% /dev
tmpfs 941108 0 941108 0% /dev/shm
tmpfs 941108 98920 842188 11% /run
tmpfs 941108 0 941108 0% /sys/fs/cgroup
/dev/vda1 41151808 11165608 27872768 29% /
tmpfs 188224 0 188224 0% /run/user/0
tmpfs 188224 0 188224 0% /run/user/1002
[root@iz2zeczv3xrnm2jx6aayhxz ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 909M 0 909M 0% /dev
tmpfs 920M 0 920M 0% /dev/shm
tmpfs 920M 97M 823M 11% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/vda1 40G 11G 27G 29% /
tmpfs 184M 0 184M 0% /run/user/0
tmpfs 184M 0 184M 0% /run/user/1002
将系统内的所有特殊文件格式以及名称都列出来
[root@iz2zeczv3xrnm2jx6aayhxz ~]# df -aT
Filesystem Type 1K-blocks Used Available Use% Mounted on
sysfs sysfs 0 0 0 - /sys
proc proc 0 0 0 - /proc
devtmpfs devtmpfs 930480 0 930480 0% /dev
securityfs securityfs 0 0 0 - /sys/kernel/security
tmpfs tmpfs 941108 0 941108 0% /dev/shm
devpts devpts 0 0 0 - /dev/pts
tmpfs tmpfs 941108 98920 842188 11% /run
tmpfs tmpfs 941108 0 941108 0% /sys/fs/cgroup
cgroup cgroup 0 0 0 - /sys/fs/cgroup/systemd
pstore pstore 0 0 0 - /sys/fs/pstore
df后面加上目录或是文件时,df会自动的分析该目录或文件所在的磁盘分区的容量
[root@iz2zeczv3xrnm2jx6aayhxz ~]# df -h /etc
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 11G 27G 29% /
由于df只要读取的数据几乎都是针对一整个文件系统,因此读取的范围只要是在超级区块内的信息,所以这个命令显示结果的速度非常快。在显示的结果中你需要特别留意的是根目录,的的剩余容量。
du
-a 列出所有的文件与目录容量,因为默认仅统计目录下面的文件量
-h 友好的格式
-s 仅列出总量,而不列出每个各别的目录占用量
-S 不包括子目录下的的统计,与-s有点差别
-k 以kb列出容量显示
-m 以列出容量显示
直接输入du没有任何选项时,则du会分析[目前所在目录]的文件与目录所占用的磁盘空间,但是,实际显示是,仅会显示目录容量(不含文件), 因此(.)目录有很多文件没有别列出来。所以全部的目录相加不会等于(.)目录,此外,输出的数值数据为1k大小的容量单位。
[root@iz2zeczv3xrnm2jx6aayhxz ~]# du
8 ./.oracle_jre_usage
8 ./uwsgi_latest_from_installer/vhosttest/flask004
8 ./uwsgi_latest_from_installer/vhosttest/flask001
8 ./uwsgi_latest_from_installer/vhosttest/flask002
8 ./uwsgi_latest_from_installer/vhosttest/flask003
8 ./uwsgi_latest_from_installer/vhosttest/flask005
48 ./uwsgi_latest_from_installer/vhosttest
192 ./uwsgi_latest_from_installer/buildconf
12 ./uwsgi_latest_from_installer/valgrind
40 ./uwsgi_latest_from_installer/lib
8 ./uwsgi_latest_from_installer/tests/templates
8 ./uwsgi_latest_from_installer/tests/t
260 ./uwsgi_latest_from_installer/tests
72 ./uwsgi_latest_from_installer/apache2
检查根目录下面每个目录所占用的容量,
这个是经常被使用的功能,利用通配符*来代表每个目录,如果想要检查某个目录下,哪个子目录占用最大的容量,可以用这个方法找出来。
[root@iz2zeczv3xrnm2jx6aayhxz ~]# du -sm /*
0 /bin
200 /boot
37 /data
0 /dev
40 /etc
483 /home
0 /lib
0 /lib64
1 /lost+found
1 /media
1 /mnt
1 /opt
至于-S这个选项部分,由于du默认会将所有文件的大小均列出,因此假设你在/etc下面使用du时,所有的文件大小,包括/etc下面的子目录也会被计算一次。所以想要列出某目录下的全部数据,可以加上-S选项。
sed
-n 使用安静模式,在一般sed的用法中,所有来自stdio的数据一般都会被列出到屏幕上,当如果加上-n参数后,则只有有经过sed特殊处理的那一行才会被列出来
-e 直接在命令行模式上进行sed操作编辑
-f 直接将sed的操作写在一个文件内,- f filename 则可以执行filename内的sed操作
-r sed的操作使用的是扩展形正则表达式的语法(默认是基础正则表达式语法)
-i 直接修改读取的文件内容,而不是由屏幕输出
操作说明:
n1, n2: 不见得会存在,一般代表[选择进行操作的行数],举例来说,如果操作时需要在10到20行之间的,则【10,20[操作行为]】
fuction 有下面的东西:
a 新增,a后面可以接字符,而这些字符会在新的一行出现,(目前的下一行)
c 替换,c的后面可以接字符,这些字符可以替换n1,n2之间的行
d 删除,因为是删除,所以d后面通常不接任何东西
i 插入,i 的后面可以接字符,而这些字符会在新的一行出现(目前的上一行)
p 打印,亦即将某个选择的数据打印出来,通常p会与参数sed -n 一起运行,
s 替换,可以直接进行替换的工作,通常这个s的操作可以搭配正则表达式,例如 1,20s/old/new/g
以行为单位的新增/删除功能
删除
nl 是加行号打印文本,原本应该是要执行sed-e才对,没有-e也行,同时后面要加'' 实测"" 也行,特别注意,删除只是在屏幕打印的删除,相当于py的切片,源文件并没有删除。
nl sedtest | sed '2,36d' # 删除2到36行
nl sedtest | '2d' # 删除第2行
n1 sedtest | '3,$d' # 删除第3行开始到最后一行
新增
nl sedtest | sed '2a #################' # 在第二行后加内容
nl sedtest | sed '2i #################' # 在第二行前加内容
nl sedtest | sed '2i ################# /
> sfsadfsadf' # 插入多行内容
以行为单位的替换与显示功能
nl sedtest | sed '2,5c 替换的内容'
显示指定行的内容
nl sedtest | sed -n '5,7p'
注意要加个-n, 是安静输出,不加-n 5到7行会重复输出
部分数据的查找和替换、
下面是个稍微复杂的例子:
[root@iz2zeczv3xrnm2jx6aayhxz ~]# /sbin/ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.24.20.165 netmask 255.255.192.0 broadcast 172.24.63.255
ether 00:16:3e:12:ff:90 txqueuelen 1000 (Ethernet)
RX packets 10384212 bytes 2545361694 (2.3 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9995923 bytes 4657717520 (4.3 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
要取到inet的ip地址
[root@iz2zeczv3xrnm2jx6aayhxz ~]# /sbin/ifconfig eth0 | grep 'inet'
inet 172.24.20.165 netmask 255.255.192.0 broadcast 172.24.63.255
[root@iz2zeczv3xrnm2jx6aayhxz ~]# /sbin/ifconfig eth0 | grep 'inet' | sed 's/^.*inet //g'
172.24.20.165 netmask 255.255.192.0 broadcast 172.24.63.255
# s/^.*inet //g 是个正则,^.*实际匹配的是inet前面的空格,inet 后面有个空格,
# 实际就是把inet前面所有的空格,外加后面的一个空格全部替换成空。
[root@iz2zeczv3xrnm2jx6aayhxz ~]# /sbin/ifconfig eth0 | grep 'inet' | sed 's/^.*inet //g' \
> | sed 's/ *netmask.*$//g'
172.24.20.165
删除不要的数据保留需要的数据
[root@iz2zeczv3xrnm2jx6aayhxz ~]# cat /etc/man_db.conf | grep 'MAN'
# MANDATORY_MANPATH manpath_element
# MANPATH_MAP path_element manpath_element
# MANDB_MAP global_manpath [relative_catpath]
# every automatically generated MANPATH includes these fields
#MANDATORY_MANPATH /usr/src/pvm3/man
MANDATORY_MANPATH /usr/man
MANDATORY_MANPATH /usr/share/man
MANDATORY_MANPATH /usr/local/share/man
# set up PATH to MANPATH mapping
# *PATH* -> *MANPATH*
MANPATH_MAP /bin /usr/share/man
MANPATH_MAP /usr/bin /usr/share/man
MANPATH_MAP /sbin /usr/share/man
MANPATH_MAP /usr/sbin /usr/share/man
MANPATH_MAP /usr/local/bin /usr/local/man
# 删除以#开头的注释,但是会留下空格
[root@iz2zeczv3xrnm2jx6aayhxz ~]# cat /etc/man_db.conf | grep 'MAN' | sed 's/#.*$//g'
MANDATORY_MANPATH /usr/man
MANDATORY_MANPATH /usr/share/man
MANDATORY_MANPATH /usr/local/share/man
MANPATH_MAP /bin /usr/share/man
MANPATH_MAP /usr/bin /usr/share/man
MANPATH_MAP /sbin /usr/share/man
MANPATH_MAP /usr/sbin /usr/share/man
# 删除空格,sed '/^$/d
[root@iz2zeczv3xrnm2jx6aayhxz ~]# cat /etc/man_db.conf | grep 'MAN' | sed 's/#.*$//g' | sed '/^$/d'
MANDATORY_MANPATH /usr/man
MANDATORY_MANPATH /usr/share/man
MANDATORY_MANPATH /usr/local/share/man
MANPATH_MAP /bin /usr/share/man
MANPATH_MAP /usr/bin /usr/share/man
MANPATH_MAP /sbin /usr/share/man
MANPATH_MAP /usr/sbin /usr/share/man
MANPATH_MAP /usr/local/bin /usr/local/man
MANPATH_MAP /usr/local/bin /usr/local/share/man
MANPATH_MAP /usr/local/sbin /usr/local/man
MANPATH_MAP /usr/local/sbin /usr/local/share/man
MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man
MANPATH_MAP /usr/bin/X11 /usr/X11R6/man
sed还可以直接修改文件内容(危险操作)
sed -i 's/\.s/\!/g' xx.txt
# 将xx.txt每行末尾的. 替换成! 注意转意
awk
相较于sed常常作用于一整个行的处理,awk则比较倾向于一行当中分成数个字段来处理。因此,awk相当于处理小型的文本数据。
通常运行的模式: awk '条件类型1{操作1} 条件类型2{操作2} ... ' filename
[root@iz2zeczv3xrnm2jx6aayhxz ~]# last -n 5
root pts/0 123.113.35.194 Sun Jan 12 23:51 still logged in
root pts/0 123.113.35.194 Sun Jan 12 11:33 - 20:10 (08:36)
root pts/0 111.21.39.46 Sun Dec 22 13:11 - 16:39 (03:28)
root pts/0 111.21.39.46 Thu Dec 19 17:01 - 17:06 (00:04)
root pts/0 111.21.39.46 Thu Dec 19 10:45 - 11:41 (00:56)
[root@iz2zeczv3xrnm2jx6aayhxz ~]# last -n 5 | awk '{print $1 "\t" $3}'
# \t 是tab分隔符
root 123.113.35.194
root 123.113.35.194
root 111.21.39.46
root 111.21.39.46
root 111.21.39.46
每一行的每个字段都是有变量名称,那就是$1$2等变量名称。$1是每行第一个变量,$0是一整行数据。
变量名称 | 代表意义 |
NF | 每一行拥有字段的总数 |
NR | 目前awk所处理的是第几行数据 |
FS | 目前的分割符,默认是空格键 |
$ last -n 5 | awk '{print $1 "\t lines:" NR "\t columns:" NF}'
plat_dev lines:1 columns:10
plat lines:2 columns:10
plat_dev lines:3 columns:10
plat_dev lines:4 columns:10
plat_dev lines:5 columns:10
在/etc/passwd 当中是以冒号":"来作为字段分隔符的,该文件中第一字段为账号,第三字段是UID。要查看第三栏小于10以下的的数据,并且仅列出账号与第三列,
[plat_dev@BJHTYD-Client-104-11 ~]$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
[plat_dev@BJHTYD-Client-104-11 ~]$ cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3}'
root:x:0:0:root:/root:/bin/bash
bin 1
daemon 2
adm 3
sync 5
shutdown 6
halt 7
但是第一行root:x:0:0:root:/root:/bin/bash显示并不正确,因为读入第一行时,那些变量$1$2默认还是以空格键为分隔符,虽然我们定义了FS=":",但是却仅能在第二行才开始生效。所以可以预先设置awk的变量,利用BEGIN这个关键词。