一、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).*21" 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 "1ahello world" sort.txt
在以上命令中,添加后的内容实际是没有真正写到文件中的,如果要写到文件中去,则需要使用 -i 。
# 在第一行后面添加hello world,并真正写入文档。 sed -i "1ahello 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 '$ahello 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:)/152/" inittab
九、文本分析工具 [awk]
awk也是按行来处理的,会将操作分别作用于每一行。
# -F设置分隔符,print表示打印,$1表示第一列。注意{}外面只能用单引号。 awk -F':' '{print $1}' passwd
# 打印第一列和第七列,用逗号隔开 awk -F':' '{print $1,$7}' passwd
在第一行前面和最后面打印标签:
awk -F':' 'BEGIN{print "name number"} {print $1" "$7} END{print "this is end"}'
BEGIN、END是有名函数表示在第一行之前以及最后一行之后执行一次。print打印的字符串要用双引号, 是制表符。
打印passwd文件中的行数,每行的列数,行的内容:
# 打印行数,每行列数,行的所有内容 [root@centos-clone1 etc]# awk -F':' '{print NR" "NF" "$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" "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" "role[i]" "name[i]}}' test.txt
1.同name数据结构一样,我们再添加一个叫role的hashmap,用来保存每个人的角色。
2.在最后打印的时候,通过key名称来访问他的角色,并一起打印。