基础概念

一台服务器有多块硬盘,在/dev下,sd开头为物理设备,vd开头为虚拟设备,以[a..z]来命名不同设备,以[1..]命名不同分区,如sda,sdb1,sdb2,IDE设备则是以hd开头

硬盘的分区分为两种:基本分区和扩展分区,要么4基本分区,要么3基本分区+1扩展,扩展分区必须进行再分区才能使用

常用文件系统:ext4:ext3改进版,支持的存储容量高达1EB,且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block块,从而极大地提高了读写效率。

当硬盘被格式化后,linux会创建一个硬盘地图superblock,记录文件系统的整体信息,包括inode/block的总量、使用量、剩余量、文件系统的格式与相关信息

inode:记录文件属性,一个文件使用一个inode,默认128字节,一个block占4B
block:用于存储数据

swap分区是通过在硬盘中预先划分一定空间,吧内存中暂不常使用的数据临时放在硬盘中,以腾出空间给别的更活跃的程序使用的技术

分区管理命令

lsblk:列出分区

[root@server1 ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   19G  0 part
  ├─centos-root 253:0    0   17G  0 lvm  /
  └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sdb               8:16   0    2G  0 disk
└─sdb1            8:17   0  500M  0 part /mnt/sdb1
sr0              11:0    1  918M  0 rom

df

-h:易读
-T:显示文件系统类型
[root@server1 ~]# df -Th
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        17G  1.2G   16G    7% /
devtmpfs                devtmpfs  475M     0  475M    0% /dev
tmpfs                   tmpfs     487M     0  487M    0% /dev/shm
tmpfs                   tmpfs     487M  7.7M  479M    2% /run
tmpfs                   tmpfs     487M     0  487M    0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  133M  882M   14% /boot
/dev/sdb1               ext4      477M  2.3M  445M    1% /mnt/sdb1
tmpfs                   tmpfs      98M     0   98M    0% /run/user/0

fdisk:分区管理工具

fdisk 磁盘名
命令(输入 m 获取帮助):m
命令操作
   d   删除分区信息
   l   列出可用分区类型
   m   帮助
   n   添加分区
   p   打印分区信息
   q   不保存退出
   t   改变分区类型
   w   保存退出

fdisk只是暂时性的,需要保存才会写入

mkfs:建立文件系统

mkfs.系统 分区名

mount/umount:临时挂载、卸载

mount 磁盘 挂载点
-a:挂载所有/etc/fstab中定义的文件系统
-t:指定文件系统类型

umount 磁盘

/etc/fstab:永久挂载

/dev/device   mountpoint   type   rules   0   order

设备 挂载点 文件系统 规则 dump系统备份工具,0表示不备份 fsck检查顺序0不检查

规则:

    auto 开机自动挂载
    default 按照大多数永久文件系统的缺省值设置挂载定义
    noauto 开机不自动挂载
    nouser 只有超级用户可以挂载
    ro 按只读权限挂载
    rw 按可读可写权限挂载
    user 任何用户都可以挂载

挂载磁盘步骤

  1. 添加磁盘
  2. fdisk
  3. mkfs
  4. mount或者fstab

案例

永久挂载案例

添加磁盘,发现/dev下多了sdb

fdisk /dev/sdb
n
+500
p发现多了sdb1分区
w保存

mkfs.ext4 /dev/sdb1

blkid /dev/sdb1

vim /etc/fstab

UUID="8b838620-0b0d-4f78-b192-ed60958e7df6" /mnt/sdb1 ext4 defaults 0 0

重启后挂在依然存在
avatar

swap

[root@server1 ~]# umount /dev/sdb1
[root@server1 ~]# vim /etc/fstab #删除原本的挂载信息
[root@server1 ~]# mkswap /dev/sdb1
mkswap: /dev/sdb1: warning: wiping old ext4 signature.
正在设置交换空间版本 1,大小 = 511996 KiB
无标签,UUID=f59a3855-f407-4e0c-a0b8-5b9d8fcf9ff2
[root@server1 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           972M         98M        730M        7.6M        143M        710M
Swap:          2.0G          0B        2.0G
[root@server1 ~]# swapon /dev/sdb1
[root@server1 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           972M         99M        729M        7.6M        143M        710M
Swap:          2.5G          0B        2.5G


vim /etc/fstab


/dev/sdb1 swap swap defaults 0 0

重启后再用free -h查看,发现多出的0.5g还在

vim /etc/fstab #删除刚才加入的那行
swapoff /dev/sdb1
再次查看已经成功卸载

磁盘容量配额

avatar

[root@server1 ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p):
Using default response p
分区号 (2-4,默认 2):
起始 扇区 (1026048-4194303,默认为 1026048):
将使用默认值 1026048
Last 扇区, +扇区 or +size{K,M,G} (1026048-4194303,默认为 4194303):+1G
分区 2 已设置为 Linux 类型,大小设为 1 GiB

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:2147 MB, 2147483648 字节,4194304 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xc6750702

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     1026047      512000   83  Linux
/dev/sdb2         1026048     3123199     1048576   83  Linux

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
正在同步磁盘。

# 准备好盘

partprobe #重新读取分区表

[root@server1 ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   19G  0 part
  ├─centos-root 253:0    0   17G  0 lvm  /
  └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sdb               8:16   0    2G  0 disk
├─sdb1            8:17   0  500M  0 part [SWAP]
└─sdb2            8:18   0    1G  0 part
sr0              11:0    1  918M  0 rom

# 格式化

[root@server1 ~]# mkfs.ext4 /dev/sdb2
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376

Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (8192 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

# 创建挂载点

[root@server1 ~]# cd /mnt
[root@server1 mnt]# ll
总用量 0
drwxr-xr-x. 2 root root 6 1月  14 10:29 sdb1
[root@server1 mnt]# mkdir tmp
[root@server1 mnt]# mount /dev/sdb2 /mnt/tmp
[root@server1 mnt]# df -Th
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        17G  1.2G   16G    7% /
devtmpfs                devtmpfs  475M     0  475M    0% /dev
tmpfs                   tmpfs     487M     0  487M    0% /dev/shm
tmpfs                   tmpfs     487M  7.7M  479M    2% /run
tmpfs                   tmpfs     487M     0  487M    0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  133M  882M   14% /boot
tmpfs                   tmpfs      98M     0   98M    0% /run/user/0
/dev/sdb2               ext4      976M  2.6M  907M    1% /mnt/tmp

# 创建组和指定家目录的用户
[root@server1 mnt]# groupadd usergrp
[root@server1 mnt]# useradd -g usergrp -b /mnt/tmp/ user1
useradd: cannot set SELinux context for home directory /mnt/tmp//user1
[root@server1 mnt]# ^C
[root@server1 mnt]# setenforce 0
[root@server1 mnt]# userdel -r user1
userdel: user1 邮件池 (/var/spool/mail/user1) 未找到
userdel:未找到 user1 的主目录“/mnt/tmp//user1”
[root@server1 mnt]# useradd -g usergrp -b /mnt/tmp/ user1
[root@server1 mnt]# useradd -g usergrp -b /mnt/tmp/ user2

# 查看挂载点是否支持quota,不支持重新挂载

[root@server1 mnt]# mount | grep tmp
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=485792k,nr_inodes=121448,mode=755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)
tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=99596k,mode=700)
/dev/sdb2 on /mnt/tmp type ext4 (rw,relatime,seclabel,data=ordered)
[root@server1 mnt]# mount -o remount,usrquota,grpquota /mnt/tmp/
[root@server1 mnt]# mount | grep tmp
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=485792k,nr_inodes=121448,mode=755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)
tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=99596k,mode=700)
/dev/sdb2 on /mnt/tmp type ext4 (rw,relatime,seclabel,quota,usrquota,grpquota,data=ordered)

# 确保开机自启quota

[root@server1 mnt]# tail -n 1 /etc/mtab >> /etc/fstab

#安装quota

yum install quota -y

# cd到对应目录

#开启

quotacheck -avug
quotaon -avug

# 配置
edquota -u user1
edquota -p user1 -u user2#复制配置

avatar

#修改宽限时间
[root@server1 tmp]# edquota -t

#查看限制情况
[root@server1 tmp]# repquota -as
*** Report for user quotas on device /dev/sdb2
Block grace time: 7days; Inode grace time: 7days
                        Space limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --     20K      0K      0K              2     0     0
user1     --     16K    245M    293M              4     0     0
user2     --     16K      0K      0K              4     0     0




## 测试

[root@server1 tmp]# passwd user1
更改用户 user1 的密码 。
新的 密码:
无效的密码: 密码是一个回文
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@server1 tmp]# su user1
[user1@server1 tmp]$ cd
[user1@server1 user1]$ dd if=/dev/zero of=test1 bs=10M count=20
记录了20+0 的读入
记录了20+0 的写出
209715200字节(210 MB)已复制,1.43965 秒,146 MB/秒
[user1@server1 user1]$ ll
总用量 204800
-rw-r--r--. 1 user1 usergrp 209715200 1月  14 12:57 test1
[user1@server1 user1]$ ll -h
总用量 200M
-rw-r--r--. 1 user1 usergrp 200M 1月  14 12:57 test1
[user1@server1 user1]$ dd if=/dev/zero of=test2 bs=10M count=20
sdb2: warning, user block quota exceeded.
sdb2: write failed, user block limit reached.
dd: 写入"test2" 出错: 超出磁盘限额
记录了10+0 的读入
记录了9+0 的写出
97468416字节(97 MB)已复制,0.970785 秒,100 MB/秒

基础权限

[root@server1 ~]# ll
总用量 12
-rw-------. 1 root root 1241 1月  12 10:11 anaconda-ks.cfg
-rw-r--r--. 1 root root    0 1月  13 10:13 test
-rw-r--r--. 1 root root    0 1月  13 10:31 testttt
-rw-r--r--. 1 root root  105 1月  13 10:41 tmp1
-rw-r--r--. 1 root root   51 1月  13 10:46 tmp2

ll出来前面那一串-rw-r--r--,开头一格表示文件类型,后面每三个一组,分别表示属主(u)、属组(g)、其他人(o)的权限

权限类型

读r:4
写w:2
执行x:1
权限对文件对目录
r读取可ls
w可写可创建删除touch,rm
x可执行可cd

chmod 修改权限

chmod 权限(000-777) file

avatar

使用符号修改:

chmod对象赋值符权限类型file
u+r
g-w
o=x
a

avatar

chown修改属主数组

chown 属主:属组 file  #修改属主数组
chown 属主 file  #修改属主
chown :数组  file  #修改数组

setfacl getfacl ACL设置基本权限

-m:添加acl设定
-x:删除acl设定
-b:移除所有acl设定
-R:递归添加
-d:添加默认设定

[root@server1 tmp]# getfacl 123
# file: 123
# owner: root
# group: root
user::rwx
group::rwx
other::rwx

[root@server1 tmp]# setfacl -m u:u2:- 123
[root@server1 tmp]# getfacl 123
# file: 123
# owner: root
# group: root
user::rwx
user:u2:---
group::rwx
mask::rwx
other::rwx

特殊权限

文件有三种特殊权限:

SUID 4:借出程序所有者的权限,只对二进制程序有效
    s:程序属主有x权限,如果有,可以暂借
    S:程序属主没有x权限

SGID:借出属组的权限,只对二进制程序有效
    s:程序属主有x权限,如果有,可以暂借
    S:程序属主没有x权限

SBIT:用于共享目录,当属主拥有x权限,用小写的t表示,当没有,用T表示,当用户在此目录创建文件,只有root用户和自己可以删除该文件,其他用户不可修改

使用chomod来修改(分别对应ugo)

[root@server1 tmp]# ll /etc/passwd
-rw-r--r--. 1 root root 986 1月  13 18:58 /etc/passwd
# 虽然passwd普通用户没有w权限,但是依旧能够修改自己的密码
[root@server1 tmp]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月  10 2014 /usr/bin/passwd
[root@server1 /]# ll -d /tmp
drwxrwxrwt. 10 root root 242 1月  13 20:44 /tmp

umask

新建的目录和文件会收到umask影响,计算方式为777-umask

[root@server1 /]# umask 0000  #临时修改umask
[root@server1 ~]# mkdir test1
drwxrwxrwx. 2 root root    6 1月  13 20:51 test1

如果要长期修改,改/etc/profile,但不推荐

基础

每个进程都得作为特定的用户发起运行
与该进程相关的用户的权限确定该进程可访问的文件和目录
每个文件有由一个特定的用户所拥有
用户的权限决定了他能访问哪些文件和目录

uid:

0:root
1-999:系统用户
1000+:普通用户

查看

id

查看当前用户/某用户的信息

[root@server1 ~]# id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@server1 ~]# id root
uid=0(root) gid=0(root) 组=0(root)

查看文件属主属组

[root@server1 ~]# ll test
-rw-r--r--. 1 root root 0 1月  13 10:13 test

查看进程的运行者

ps aux
avatar

用户信息相关文件

passwd:用户名:密码占位符:uid:gid:秒数:home:shell
avatar

shadow:密码相关
avatar

group:组相关
avatar

用户管理

groupadd,groupdel,gpassword

useradd,usermod,userdel

passwd,chage

用户组

[root@server1 ~]# groupadd t1
[root@server1 ~]# groupadd t2
[root@server1 ~]# groupadd -g 2000 t3 #指定gid
[root@server1 ~]# tail -n3 /etc/group
t1:x:1000:
t2:x:1001:
t3:x:2000:


[root@server1 ~]# groupdel t1
[root@server1 ~]# groupdel t2
[root@server1 ~]# tail -n3 /etc/group
chrony:x:996:
slocate:x:21:
t3:x:2000:

gpassword:将用户从组中添加或者删除

-a:添加
-d:删除
-r:删除密码
[root@server1 ~]# gpasswd -a u2 ttt
正在将用户“u2”加入到“ttt”组中
[root@server1 ~]# id u2
uid=1001(u2) gid=2000(t3) 组=2000(t3),2001(ttt)

用户

useradd:添加用户

-u:指定uid
-g:指定gid,该组必须已存在
-s:shell
-G:附加组,该组必须已存在
-r:创建系统用户
-c:注释
-d:家目录

默认添加的shell为/bin/bash,不同的shell有不同的功能和特点。如果想要创建一个安全的仅作运行进程用的用户,可以把shell指定为/sbin/nologin,该用户将无法使用登录功能,较为安全


[root@server1 ~]# useradd u1
[root@server1 ~]# useradd u2 -g 2000
[root@server1 ~]# useradd -G 2000 u3
[root@server1 ~]# id u1
uid=1000(u1) gid=1000(u1) 组=1000(u1)
[root@server1 ~]# id u2
uid=1001(u2) gid=2000(t3) 组=2000(t3)
[root@server1 ~]# id u3
uid=1002(u3) gid=1002(u3) 组=1002(u3),2000(t3)

userdel:删除用户

-r:删除用户的同时删除家目录和mail

[root@server1 ~]# userdel -r u1
[root@server1 ~]# id u1
id: u1: no such user

passwd:修改密码

root可以直接、强制修改
普通用户必须提供原密码,且得设置一个安全的密码
-n:指定最短使用期限
-x:指定最大使用期限
-w:提前多少天开始警告
--stdin:从标准输入接收用户密码,无需重复输入
[root@server1 ~]# passwd u2
更改用户 u2 的密码 。
新的 密码:
无效的密码: 密码是一个回文
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

[root@server1 ~]# echo '123' | passwd --stdin u3
更改用户 u3 的密码 。
passwd:所有的身份验证令牌已经成功更新。

chage

-d, --lastday 最近日期 将最近一次密码设置时间设为“最近日期” 
-E, --expiredate 过期日期 将帐户过期时间设为“过期日期” 
-h, --help 显示此帮助信息并推出 -I, --inactive INACITVE 过期 INACTIVE 天数后,设定密码为失效状态 
-l, --list 显示帐户年龄信息 
-m, --mindays 最小天数 将两次改变密码之间相距的最小天数设为“最小天数” 
-M, --maxdays 最大天数 将两次改变密码之间相距的最大天数设为“最大天数” 
-R, --root CHROOT_DIR chroot 到的目录 
-W, --warndays 警告天数 将过期警告天数设为“警告天数”

chage -d 0 username #强制用户在下次登录的时候修改密码

usermod:修改用户组

-G:覆盖原有附加组
-aG:添加新的附加组

[root@server1 ~]# id u3
uid=1002(u3) gid=1002(u3) 组=1002(u3),2000(t3)
[root@server1 ~]# groupadd ttt
[root@server1 ~]# usermod -G ttt u3
[root@server1 ~]# id u3
uid=1002(u3) gid=1002(u3) 组=1002(u3),2001(ttt)

login.defs

创建用户时参照的文件,此文件对root无效,当文件中的配置与passwd和shadow发生冲突时,以后两者为准

MAIL_DIR /var/spool/mail     创建用户时,系统会在目录 /var/spool/mail 中创建一个用户邮箱,比如 lamp 用户的邮箱是 /var/spool/mail/lamp。
PASS_MAX_DAYS 99999    密码有效期,99999 是自 1970 年 1 月 1 日起密码有效的天数,相当于 273 年,可理解为密码始终有效。
PASS_MIN_DAYS 0    表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认值是 0。
PASS_MIN_LEN 5    指定密码的最小长度,默认不小于 5 位,但是现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效。
PASS_WARN_AGE 7    指定在密码到期前多少天,系统就开始通过用户密码即将到期,默认为 7 天。
UID_MIN 500     指定最小 UID 为 500,也就是说,添加用户时,默认 UID 从 500 开始。注意,如果手工指定了一个用户的 UID 是 550,那么下一个创建的用户的 UID 就会从 551 开始,哪怕 500~549 之间的 UID 没有使用。
UID_MAX 60000    指定用户最大的 UID 为 60000。
GID_MIN 500    指定最小 GID 为 500,也就是在添加组时,组的 GID 从 500 开始。
GID_MAX 60000    用户 GID 最大为 60000。
CREATE_HOME yes    指定在创建用户时,是否同时创建用户主目录,yes 表示创建,no 则不创建,默认是 yes。
UMASK 077权限掩码为 077。
USERGROUPS_ENAB yes    指定删除用户的时候是否同时删除用户组,准备地说,这里指的是删除用户的初始组,此项的默认值为 yes。
ENCRYPT_METHOD SHA512

新建用户的家目录下的bash开头的文件是从/etc/skel/复制过去的

avatar
avatar

.bashrc:主要保存别名、系统路径,提示符

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions


如果想修改环境变量,如下
PATH=/usr/bin:/usr/local/bin:/bin

如果想修改别名,如下
alias xx='xx'

su与sudo

sudo提权

必须要先授权才能提权,未经授权使用sudo效果如下
avatar

提权方式参照/etc/sudoers,将该用户加入到wheel组里面

[root@server1 u2]# gpasswd -a u3 wheel
正在将用户“u3”加入到“wheel”组中

[u3@server1 home]$ useradd u4
-bash: /usr/sbin/useradd: 权限不够
[u3@server1 home]$ sudo useradd u4
[u3@server1 home]$ sudo useradd u5


[root@server1 u2]# tail -n4 /etc/passwd
u2:x:1001:2000::/home/u2:/bin/bash
u3:x:1002:1002::/home/u3:/bin/bash
u4:x:1003:1003::/home/u4:/bin/bash
u5:x:1004:1004::/home/u5:/bin/bash

su切换用户

su只切换身份,su -连身份和shell一起切换

avatar

重定向

标准输出:

标准正确输出1
标准错误输出2

输出重定向:

正确覆盖重定向>
正确追加重定向>>
错误覆盖重定向2>
错误追加重定向2>>

合并输出,即将正确输出和错误输出重定向为同一个数据流:

覆盖重定向&>
追加重定向&>>
将错误重定向到正确输出中2>&1
将正确重定向到错误输出中1>&2

输入重定向:

覆盖cat > file <<EOF .....EOF
追加cat >> file <<EOF......EOF

管道

command1 | command2 | command3

前一个命令的执行结果会被当过后一个命令的参数来使用

小工具

tr

转换

[root@server1 ~]# cat /etc/passwd |head -n3 | tr 'a-e' 'A-E' > tmp1
[root@server1 ~]# cat tmp1
root:x:0:0:root:/root:/Bin/BAsh
Bin:x:1:1:Bin:/Bin:/sBin/nologin
DAEmon:x:2:2:DAEmon:/sBin:/sBin/nologin

读取passwd前5行并把a-e转为大写把输出结果保存到文件中

-d:删除

wc

统计

-l:行数

-w:单词数

-c:字符数

[root@server1 ~]# cat /etc/passwd | wc -l
19

cut

切分

-d指定分隔符
-f指定字段

[root@server1 ~]# cat /etc/passwd | cut -d: -f2,3
x:0
x:1
x:2
x:3
x:4
x:5
x:6
x:7
x:8
x:11
x:12
x:14
x:99
x:192
x:81
x:999
x:74
x:89
x:998

sort

排序

-f:忽略大小写
-r:逆序
-t:字段分隔符
-k #:以指定字段为标准排序
-n:按照数值排序,不然按照首字母
-u:排序后去重

[root@server1 ~]# cat /etc/passwd | cut -d: -f3 | sort -nr > tmp2
[root@server1 ~]# cat tmp2
999
998
192
99
89
81
74
14
12
11
8
7
6
5
4
3
2
1
0

uniq

去重

-c:显示每行出现的行数
-d:只显示重复过的行
-u:只显示没重复的行

[root@server1 ~]# cut -d: -f6-10 /etc/passwd  | uniq -c
      1 /root:/bin/bash
      1 /bin:/sbin/nologin
      1 /sbin:/sbin/nologin
      1 /var/adm:/sbin/nologin
      1 /var/spool/lpd:/sbin/nologin
      1 /sbin:/bin/sync
      1 /sbin:/sbin/shutdown
      1 /sbin:/sbin/halt
      1 /var/spool/mail:/sbin/nologin
      1 /root:/sbin/nologin
      1 /usr/games:/sbin/nologin
      1 /var/ftp:/sbin/nologin
      4 /:/sbin/nologin
      1 /var/empty/sshd:/sbin/nologin
      1 /var/spool/postfix:/sbin/nologin
      1 /var/lib/chrony:/sbin/nologin

光标跳转

上下左右

上下左右
#command:跳转#个字符

单词跳转

w:下个单词的词首
e:下个单词的词尾
b:上个单词的词首
#command:跳转#个单词

行首行尾跳转

^:行首非空白字符
0:行首
$:行尾

行间移动

#G:跳到第#行
G:跳到尾巴
gg:跳到开头

文本编辑

删除

d:配合光标跳转删除
d^
d$
d#command
d0
dw
de
db
dd:删除光标所在行
#dd:删除多行
ggdG:删除全部

x删除光标所在字符
#x

复制剪切粘贴撤销

y,复制,用法类d
yy 以行为单位
#yy #行
ygg
yG

p粘贴

u撤销

模式转换

插入模式

a:选中字母后
i:选中字母
o:选中一行下面新建一行
A:行尾
esc:退出

末行模式

:
#:进入第几行
w:保存
w filename:另存为
q:退出
command!:强制
x 、ZZ:保存并退出
X:加密文档
r filename:读入文件到当前行后
# r filename:读入文件到5行后

查找替换

s/old/new/选项(g全文,c交互确认) 替换

50,100 s/man/MAN/gc 把50到100的man换成MAN并确认每一个替换

,$ s/.*// 从光标所在行开始一直到最后替换为空
如果出现替换文本里面有/,担心会造成歧义,可以使用#或者@来替代/

环境配置

在vim里面输入的都是临时的配置,如需永久环境,个人修改自己目录下的.vimrc,全局修改/etc/vimrc

set nu:行号
set nonu:取消行号
set ai:自动缩进
set noai:取消自动缩进
set ic:忽略字符的大小写
set noic:不忽略
set hlsearch:高亮搜索
set nohlsearch:不高亮
set sm:括号匹配
set nosm:不匹配
help:帮助

4VOTA[7XQ0{JYQX{D98(QNC.png
个人答案

cd /tmp
[root@server1 tmp]# mkdir vitest

[root@server1 tmp]# cd vitest/

[root@server1 vitest]# cp /etc/man_db.conf man.config

vi man.config


set nu

58G
40l

gg
?bzip2

50,100 s/man/MAN/gc   g为每行全部替换,不然只换一个,c为确认

u

65G
9yy
G
$
p

21,42 g/^#/d

w ./man.test.config

27G
d15l

gg
o
I am a student

esc
wq