[Linux系统] (1)常用操作(CentOS 7.x)

一、Linux系统配置

1.修改主机名 [/etc/hostname]

vi /etc/hostname

在其中将旧名字修改为新主机名,保存,重启生效。

 

2.本地DNS映射 [/etc/hosts]

vi /etc/hosts

添加ip-name对:

192.168.1.121 centos-clone1

保存即可。

 

3.查看命令信息 [type][file]

type ifconfig

得到信息:

ifconfig is /usr/sbin/ifconfig

说明ifconfig位于/usr/sbin目录下。

继续查看该命令的类型:

file /usr/sbin/ifconfig

得到以下内容:

/usr/sbin/ifconfig: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=22d5b3be8d3ce3c71cad5b982581ede262397b56, stripped

注意ELF,表示这是一个二进制文件的编码格式,说明是一个可执行的二进制文件。

我们再看看yum的类型:

file /usr/bin/yum
/usr/bin/yum: Python script, ASCII text executable

说明yum是一个python脚本。

再看看cd的类型:

type cd
cd is a shell builtin

cd是一个shell的内建程序。

 

4.环境变量PATH

打印环境变量:

echo $PATH

在PATH环境变量中,我们需要将软件的可执行程序目录(一般是bin)添加进去。例如:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

这是系统默认添加在PATH环境变量中的目录,假设我们安装了JDK,则需要将JDK下的bin目录也添加进去,这样我们就可以直接使用java、javac等命令。

 

5.补全mini系统中的帮助工具man

在Mini版的系统中,可能确实man工具或man不完整,通过yum安装完整版的man:

yum install man man-pages -y

 

6.命令的学习帮助 [help][man]

命令分为内部命令和外部命令

内部命令就是shell的内建命令,例如cd、type等。内部命令通过help来学习:

help cd

外部命令就是我们安装的命令,例如ifconfig等。外部命令通过man来学习:

man ifconfig

 

二、Linux基本操作

1.查看磁盘信息 [df]

[root@centos-clone1 etc]# df
Filesystem              1K-blocks    Used Available Use% Mounted on
devtmpfs                  1918600       0   1918600   0% /dev
tmpfs                     1930676       0   1930676   0% /dev/shm
tmpfs                     1930676   11688   1918988   1% /run
tmpfs                     1930676       0   1930676   0% /sys/fs/cgroup
/dev/mapper/centos-root  18307072 1489260  16817812   9% /
/dev/sda1                  508588  168500    340088  34% /boot
tmpfs                      386136       0    386136   0% /run/user/0

转换为人类可读:

[root@centos-clone1 etc]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 1.9G     0  1.9G   0% /dev
tmpfs                    1.9G     0  1.9G   0% /dev/shm
tmpfs                    1.9G   12M  1.9G   1% /run
tmpfs                    1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/mapper/centos-root   18G  1.5G   17G   9% /
/dev/sda1                497M  165M  333M  34% /boot
tmpfs                    378M     0  378M   0% /run/user/0

在这里我们可以看到,磁盘使用了LVM,根目录存在于卷组centos(VG)上得逻辑卷root(LV)上,大小为18G。

但是根下面的boot目录是独立存放在sda1物理卷上的。

 

2.文件系统目录

/bin  #一般存放系统命令
/sbin  #一般存放系统命令
/boot  #引导文件
/dev  #I/O设备抽象成文件
/etc  #配置
/home  #非root用户家目录
/root  #root用户家目录
/lib  #库文件
/lib64  #库文件
/mnt  #挂载点
/usr  #软件的受管控安装目录
/var  #软件的生成文件
/opt  #非受系统管控软件,约定俗成的安装位置

 

3.统计各个文件夹大小 [df]

du -s ./   #统计当前目录大小
du -s ./*  #统计子目录各自大小

-s 表示sum即求和。如果使用./则是统计该目录的总大小,如果使用./*则是对该目录下所有子文件夹各自进行统计。

du -sh

使用 -h 表示human,以人类可读的方式显示大小:

[root@centos-clone1 usr]# du -sh ./
1.1G    ./
[root@centos-clone1 usr]# du -sh ./*
58M     ./bin
0       ./etc
0       ./games
36K     ./include
656M    ./lib
116M    ./lib64
12M     ./libexec
8.0K    ./local
43M     ./sbin
231M    ./share
0       ./src
0       ./tmp

注:使用该命令可以检查哪个文件夹占用空间最大,找到磁盘耗尽的祸源。

 

4.文件权限

[root@centos-clone1 boot]# ls -l
total 134352
-rw-r--r--  1 root root   152980 Sep 30 22:23 config-3.10.0-1062.1.2.el7.x86_64
-rw-r--r--. 1 root root   126426 Nov 20  2015 config-3.10.0-327.el7.x86_64
drwxr-xr-x  3 root root       16 Oct 14 20:48 efi
drwxr-xr-x. 2 root root       26 Oct 14 17:18 grub
drwx------. 5 root root     4096 Oct 15 13:20 grub2
-rw-r--r--. 1 root root 43048490 Oct 14 17:21 initramfs-0-rescue-62ae9a150bf641ba955e242814e7d88a.img
-rw-------  1 root root 21703346 Oct 14 20:53 initramfs-3.10.0-1062.1.2.el7.x86_64.img

使用ls -l查看详细文件列表后,我们可以看到一下内容(从前往后):

文件类型:第一位表示文件类型,d表示文件夹,-表示文件,l表示软连接,b表示字节流设备文件,c表示字符流设备文件等等。

文件权限:后面的9位每3位为一组,分别表示该用户、用户组、其他用户对该文件的读、写、执行权限。

Selinux和ACL标志:在权限的后面有一个"."或者"+",这两个符号用来表示有没有Selinux和ACL上下文,与安全有关。

硬链接数:权限部分后面的数字,表示该文件有多少个硬链接。如果是目录,则表示目录中包含的所有文件的硬链接总和。

文件所属:中间的root root表示文件所属用户,以及用户组。

文件大小:如果是文件,则直接显示文件大小,如果是文件夹,则需要通过du来统计大小。

修改时间:文件最后修改时间。

文件名称:文件或文件夹名称。

 

5.创建目录 [mkdir]

普通创建:

mkdir ./abc

递归创建:

mkdir -p ./a/b/c

横向创建:

mkdir {x,y,z}dir
[root@centos-clone1 ~]# ls
abc  anaconda-ks.cfg  xdir  ydir  zdir

 

6.删除 [rm]

删除单文件和空文件夹:

rm -f filename

-f 指force即强制删除,无需用户确认。

删除多层文件夹:

rm -rf dir

-r 指递归的删除。

不要删除根目录:

rm -rf /

这样回导致所有根目录下的文件及文件夹被删除,导致系统崩溃,删除后只剩下最初的引导程序grub。

 

7.拷贝 [cp]

拷贝一个文件:

cp filename /dstdir/newname

拷贝一个文件夹:

cp -r dirname newdirname

 

8.硬链接和软连接 [ln]

硬链接:

ln filename othername

filename指被硬链接的文件,othername表示创建的硬链接的名字。

文件被硬链接时,所有的名字都指向同一个文件,类似于java中的引用。

当删除一个硬链接时,如果还存在该文件的其他硬链接,该文件本身不会被删除,但是硬链接数量减一。

 

软链接:

ln -s filename othername

-s 表示软链接 soft link。

软链接实际上就类似于windows中的快捷方式。

windows下当我们删除原文件时,快捷方式是不被删除的,但是运行该快捷方式会表示找不到原文件。在Linux下同理,我们删除原文件后,该软链接会显红提示原文件找不到。

当我们删除软链接时,仅仅删除的是快捷方式,是不影响原文件的。

 

9.元数据 [stat]

查看一个文件的元数据(属性):

[root@centos-clone1 ~]# stat anaconda-ks.cfg 
File: anaconda
-ks.cfg Size: 1309 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 68341593 Links: 1 Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-10-14 17:22:21.958249864 +0800 Modify: 2019-10-14 17:22:21.959249872 +0800 Change: 2019-10-14 17:22:21.959249872 +0800 Birth: -

注意看其中有3个时间,Access、Modify和Change。

Access:表示最近一次访问该文件的时间。

Modify:表示最近一次修改该文件内容的时间。

Change:表示文件元数据最近一次变化的时间。(纯粹的访问该文件不会引起该时间变化,Access时间变化不影响。但是编辑文件则会导致该时间变化,估计是因为Modify时间变化了。)

 

10.管道 [|]

利用管道可以衔接2个命令,将第一命令的输出做为第二个命令的输入。

head -4 filename | tail -1

先用head读取file中的前4行,再将这4行交给tail,获取最后一行。相当于获取了file中的第4行。

echo "/" | ls -l   # 错误

上面这个命令不能得到根目录的文件列表。因为路径"/"对于ls -l来说是参数,而不是输入。可以改为如下:

echo "/" | xargs ls -l

这个命令相当于把"/"这个输出交给xargs命令,而xargs命令会将得到的输入"/"作为ls -l的参数,并运行ls命令。

 

11.过滤 [grep]

从文件中过滤出含有word的行:

grep word filename

用-v过滤出不含word的行(反选):

grep -v word filename

 

三、VI编辑器

1.打开文件

打开文件,光标定位到第5行:

vi +5 filename

打开文件,光标定位到最后一行:

vi + filename

或者打开文件后shift + G,光标也是切换到最后一行。

 

2.保存&退出

保存退出:

:wq
shift ZZ
:x

不保存退出:

:q!

 

3.vi三种模式

编辑模式:刚打开文件时的模式,即所有的键盘操作都是快捷键,例如i插入,d删除等。

插入模式:按i、a、o等可以进入插入模式,即键盘从编辑模式恢复正常内容输入功能。

末行模式:按ESC再按":",可以进入末行模式,此时可以保存退出,或者使用"/"查找,"set nu"(不是set num)显示行号等。

 

编辑模式--->插入模式:

- i :在当前光标的前面转为输入模式,也就是输入的内容插入在光标的前面。

- a:在当前光标的后面转为输入模式,在输入内容时,光标自动会先往后面移动一格,然后再插入在光标之前,可以减少肢体运动,特别是想在一行的最后插入内容。

- I:在当前行的行首转换为输入模式。

- A:当前行的行末转换为输入模式。

- o:在当前行的下面新建一行,并转入输入模式。

- O:在当前行的上面新建一行,并转入输入模式。

插入模式--->编辑模式:

ESC

编辑模式--->末行模式:

按 :

末行模式--->编辑模式:

ESC

 

4.编辑模式下的基本操作

编辑模式下的光标移动:
在编辑模式下,我们无需使用方向键来移动光标,可以使用以下几个键来进行字符级光标移动:

- h:左移
- l:右移
- j:下移
- k:上移

单词间的跳跃:

- w : 移动至下一个单词词首,即逐单词跳跃
- e : 移动至当前单词或下一个单词的词尾
- b :移动至上一个单词的词首

行内的光标移动:

数字0: 移动到当前行行首
^: 移动到行首的非空白字符
$: 移动到绝对行尾

行间光标移动(几个哥哥):

shift + G: 大写G,光标移动到最后一行的行首
gg: 两个小写g,光标移动到最前面一行的行首
数字+gg: 光标移动到数字行的行首,例如12gg,移动到第12行行首

翻页:

ctrl + f : 向后翻页
ctrl + b: 向前翻页

 

删除&替换单个字符:

- x: 删除光标处的字符
- 3x: 删除光标开始3个字符
- r: 替换光标处的字符

 

删除行、单词:

- d: 删除命令
- dd: 删除一行
- 2dd: 删除两行
- dw: 删除一个单词
- 2dw: 删除两个单词

 

复制&粘贴&剪切:

- y : 复制命令
- yy : 复制一行
- 2yy : 复制两行
- yw : 复制一个单词
- 2yw : 复制两个单词

- p : 粘贴在下方
- P : 粘贴在上方

如果是删除配合粘贴,则就是windows中的剪切。在执行dd的时候,删除的内容会放入缓存区,此时可以用p来粘贴。

 

撤销&重做:

- u : 撤销上次的操作
ctrl+r : 撤销上次的撤销
- . : 重复上次的操作

 

查找内容:

两种方式:

末行模式:
:/word
编辑模式:
/word
- n : 下一个目标
- N : 上一个目标

 

5.末行模式下的基本操作

显示行号:

:set nu

取消显示行号:

:set nonu

末行模式查找单词word,光标会定位到第一个word所在行的行首:

:/word

另一种方式则是在编辑模式下,直接使用"/word"来查找,这种方式光标会停在第一个word单词的w上。

 

范围操作:

删除指定范围的行(1,$-1):

:1,$-1d

意思是从第1行删除到倒数第2行,$表示最后一行,$-1则是倒数第二行,d表示删除命令。

删除全部行:

:1,$d

1,$表示全文,也可以使用%代替1,$

:%d

用"."代表当前行:

:1,.y  #意思是复制从第一行到当前行。
:.,.+3d  #从当前行开始删除,一共删除4行

 

替换内容:

:1,$s/word1/word2/

从第一行到最后一行(即全部行),使用s命令将word1全部替换为word2。之间的"/"是分隔符,如果word1和word2中出现了"/",则不能再使用"/"作为分隔符,我们可以使用其他特殊字符,例如"#"。

:1,$s#word1#word/2#

注意:以上命令在替换时,如果一行中有2个word1时,只会替换第一个word1。如果想要全部替换,则在最后加上g,表示global。

:1,$s#word1#word/2#g

 

四、正则

通配符:

ls -l | grep a*
ls -l | grep a??

"*"和"?"都为通配符,"*"代表0-n个任意字符,"?"表示1个任意字符。

 

正则里的匹配操作符:

\ : 转义字符
. : 匹配任意单个字符,类似通配符中的?
[125ak] : 匹配方括号中任意一个字符
[^12] : 匹配不是1、2的任意一个字符
[a-k] : 匹配属于a-k范围任意一个字符
^ : 行首
$ : 行尾
\< : 单词开头,例如\<abc,以abc开头的单词
\> : 单词结尾,xyz\>,以xyz结尾的单词

正则中的重复操作符:

? : 匹配0到1次
* : 匹配0到n次 
+ : 匹配1到多次
{n} : 匹配n次
{n,} : 匹配n到多次
{n,m} : 匹配n到m次

选择:

grep "\(oo\)\(xx\).*\2\1" filename

将oo和xx分组,".*"表示匹配任意个任意字符,然后最后oo、xx换位置,匹配到"ooxx128376xxoo"。

 

五、切割

cut命令:

# 以空格分隔,显示第一列
cut -d' ' -f1 content.txt
# 以空格分隔,显示第二列,发现没有第二列的行又出现了。
cut -d' ' -f2 content.txt
# -s 处理脏数据,即不含分隔符的行,只作为第一列。
cut -s -d' ' -f2 content.txt
# 显示第1和第3列
cut -s -d' ' -f1,3 content.txt
# 显示1-3列
cut -s -d' ' -f1-3 content.txt

 

六、排序

sort命令:

# 以空格为分隔符,按第2列排序,字典序
sort -t' ' -k2 sort.txt
# -n表示数字序
sort -t' ' -k2 -n sort.txt
# -r表示倒序
sort -t' ' -k2 -n -r sort.txt

 

七、统计

wc命令(word count):

# 统计行数
wc -l sort.txt
# 统计byte数
wc -c sort.txt
# 统计char数
wc -m sort.txt
# 统计单词数
wc -w sort.txt
# 统计最长行的长度
wc -L sort.txt

组合使用:

# 统计一个/etc文件夹有多少文件和目录
ls -l /etc | wc -l
# 只获取文件的行数(只获取数字)
cat sort.txt | wc -l

 

八、行编辑器 [sed]

# 在第一行后面添加hello world。注意,这里hello前面是反斜杠。
sed "1a\hello world" sort.txt

 在以上命令中,添加后的内容实际是没有真正写到文件中的,如果要写到文件中去,则需要使用 -i 。

# 在第一行后面添加hello world,并真正写入文档。
sed -i "1a\hello world" sort.txt
# 删除第2行
sed "2d" sort.txt
# 删除所有有hello的行,注意这里的过滤条件两边是正斜杠。
sed "/hello/d" sort.txt
# 删除含数字的行
sed "/[0-9]/d" sort.txt
# 只打印带数字的行
sed -n "/[0-9]/p" sort.txt
#其中-n表示静默模式,即不再默认显示模式空间中的内容,如果不含-n,则会显示文本全部内容
# p表示print打印
# 相当于代替了grep "[0-9]" sort.txt
# 在最后一行后面插入内容。$表示最后一行,注意这里只能使用单引号。否则$后面的内容会被认为是命令
sed -i '$a\hello world' sort.txt

将inittab中的"id:3:initdefault:"替换为"id:5:initdefault:" (即将开机命令行模式修改为开机图形界面):

sed -i "s/id:[0-6]:initdefault:/id:5:initdefault:/" inittab

也可以加上分组来实现 (id:为第一组,:initdefault:为第二组):

sed -i "s/\(id:\)[0-6]\(:initdefault:\)/\15\2/" inittab

 

九、文本分析工具 [awk]

awk也是按行来处理的,会将操作分别作用于每一行。

# -F设置分隔符,print表示打印,$1表示第一列。注意{}外面只能用单引号。
awk -F':' '{print $1}' passwd
# 打印第一列和第七列,用逗号隔开
awk -F':' '{print $1,$7}' passwd

在第一行前面和最后面打印标签:

awk -F':' 'BEGIN{print "name\tnumber"} {print $1"\t"$7} END{print "this is end"}'

BEGIN、END是有名函数表示在第一行之前以及最后一行之后执行一次。print打印的字符串要用双引号,\t是制表符。

打印passwd文件中的行数,每行的列数,行的内容:

# 打印行数,每行列数,行的所有内容
[root@centos-clone1 etc]# awk -F':' '{print NR"\t"NF"\t"$0}' passwd
1       7       root:x:0:0:root:/root:/bin/bash
2       7       bin:x:1:1:bin:/bin:/sbin/nologin
3       7       daemon:x:2:2:daemon:/sbin:/sbin/nologin
4       7       adm:x:3:4:adm:/var/adm:/sbin/nologin
5       7       lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6       7       sync:x:5:0:sync:/sbin:/bin/sync

其中NR(number row)表示行号,NF(number field)表示列数,$0表示该行的多有内容。

 

综合示例:

Tom     0       2012-12-11      car     3000
John    1       2013-01-13      bike    1000
vivi    1       2013-01-18      car     2800
Tom     0       2013-01-20      car     2500
John    1       2013-01-28      bike    3500

使用awk统计1月份每个人发的工资,其中Tom的工资分为12月和1月,我们只需要1月的。John有2份1月的工资,需要加起来。

awk '{split($3,date,"-");if(date[2]=='01'){name[$1]+=$5}} END{for(i in name){print i"\t"name[i]}}' test.txt

解释:

1.awk 默认分隔符为空格或制表符等空白符,所以这里不用指定-F。

2.使用split将$3 (2013-01-13)也就是日期分隔,使用"-"作为分隔符,将分隔后的数组放入date。

3.date[0]表示分隔前的整个时间 (2013-01-13),date[2]表示月份 (01),当date[2]为01月时,定义一个name hashmap,key为$1即文本的第一列人名,并对工资进行累加。

4.所有累加做完以后,在END中循环name hashmap,打印其中的名字和工资。

 

示例2:

上述文本中第2列的0表示Manager,1表示worker。我们需要在最后的报表结果中的内一行中将人的角色也打印出来。

awk '{split($3,date,"-");if(date[2]=='01'){name[$1]+=$5};if($2=="0"){role[$1]="Manager"}else{role[$1]="Worker"}} END{for(i in name){print i"\t"role[i]"\t"name[i]}}' test.txt

1.同name数据结构一样,我们再添加一个叫role的hashmap,用来保存每个人的角色。

2.在最后打印的时候,通过key名称来访问他的角色,并一起打印。

posted @ 2019-10-15 13:51  风间悠香  阅读(501)  评论(0编辑  收藏  举报