Linux基础入门
1. Linux基础
1.1 用户类型
- root用户
- 普通(非特权用户)
1.2 终端
1.2.1 终端类型
控制台终端: /dev/console
串行终端: /dev/ttyS#
虚拟终端: tty: /dev/tty#, tty可以有多个, 通过ctrl+alt+F#来切换, 每个虚拟终端可以登录不同的用户, 执行不同的命令, 但是相同的命令会有冲突, 比如同时安装软件, 就需要等一个终端的程序执行结束后, 另一个终端才可以执行
图形终端: startx, xwindows
CentOS6: 通过ctrl+alf+F#切换
CentOS7: 在哪个终端启动, 即位于哪个虚拟终端
- 伪终端: pty: pseudo-tty, /dev/pts/#, 如: SSH远程连接
1.2.2 查看当前所在终端
tty
[root@demo-c8 ~]# tty
/dev/pts/0
1.3 交互式接口
交互式接口: 启动终端后, 在终端设备附加一个交互式应用程序
1.3.1 交互式接口类型
- GUI
- CLI
1.3.2 Shell
- Shell是Linux系统的用户界面, 提供了用户与内核进行交互操作的一种接口. 它接收用户输入的命令并把它送入内核去执行
- Shell是一种高级程序设计语言, 提供了变量, 函数, 条件判断, 循环等开发语言的功能
- 由于Shell本身是个程序, 所以它可以被任何用户自己开发的各种Shell所代替
1.3.3 各种Shell类型
sh, bash(CentOS, Ubuntu), csh, tcsh, ksh, zsh(MacOS)
1.3.4 bash shell
- 显示当前使用的shell
[root@demo-c8 ~]# echo $SHELL
/bin/bash
- 查看当前系统使用的所有shell
[root@demo-c8 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
1.4 设置主机名称
- 主机名称不支持下划线, 但支持横线
hostname NAME
1.5 命令提示符
- #: 管理员
- $: 普通用户
- 显示提示符格式
[root@demo-c8 ~]# echo $PS1
[\u@\h \W]\$
- 提示符格式说明
\e: 控制符\033
\u: 当前用户
\h: 主机名简称, 不包含域名
\H: 主机名, 主机名.域名
\w: 当前工作目录, 显示整个目录路径, 从根开始
\W: 当前工作目录基名, 仅显示当前目录名称, 不显示全部路径
\t: 24小时时间格式
\T: 12小时时间格式
\!: 命令历史数
\#: 开机后执行的命令历史数
\$: 显示当前登录用户是root还是普通用户, #表示root用户, $表示普通用户
- CentOS修改命令行提示符
# 默认:
[root@demo-c8 ssh]# echo $PS1
[\u@\h \W]\$
# 保存到/etc/profiled.s/env.sh
# 永久修改:
[root@demo-c8 ~]# echo 'PS1="\[\e[1;32m\][\t \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \w\[\e[1;32m\]]\[\e[0m\]\\$"' >> /etc/profile.d/env.sh
[root@demo-c8 ~]#
[root@demo-c8 ~]#
[root@demo-c8 ~]# source /etc/profile.d/env.sh
- Ubuntu修改命令行提示符
# 默认:
root@u18:~# echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$
# 保存到~/.bashrc
# 永久修改
root@u18:~# echo 'PS1="\[\e[1;32m\][\t \[\e[1;33m\]\u\[\e[35m\]@\h\[\e[1;31m\] \w\[\e[1;32m\]]\[\e[0m\]\\$"' >> ~/.bashrc
root@u18:~# source ~/.bashrc
[15:29:58 root@u18 ~]#
2. Linux命令介绍
2.1 内部命令
内部命令: 集成在shell中, 不同shell的内部命令不同, 可以通过echo $SHELL命令来查看当前使用的shell版本
echo $SHELL
bash shell是Centos默认的shell, 开机自动运行, 内部集成了多个bash shell内部命令
用户登录后所有的bash shell内部命令就会加载到内存
bash shell的内部命令都集成在/bin/bash
文件中
[root@demo-c8 ~]# ll /bin/bash
-rwxr-xr-x. 1 root root 1219248 Nov 9 2019 /bin/bash
2.2 外部命令
外部命令: 非shell自带的都是外部命令, 不依赖于Shell, 无论何种Shell都可以执行
外部命令都是磁盘文件, 如果想使用,那么需要告诉系统去哪个路径下找这个文件, 找到之后才能执行
这就要依靠PATH环境变量, PATH环境变量存放的就是系统查询外部命令的搜索路径
[root@demo-c8 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin # 系统会按照PATH变量的路径从左到右依次到这些路径中查找要执行的命令,一旦找到就会执行, 如果找不到就报错,Command Not Found
2.3 Linux命令查找过程
优先级: 命令别名>内部命令>hash缓存>$PATH中的外部命令>error报错
1. 首先查看执行的命令是不是别名
2. 如果不是别名, 则看是不是内部命令, 是就执行内部命令
3. 如果不是内部命令, 则看是不是外部命令, 先看hash缓存有没有对应条目, 有就按照缓存的路径, 找到磁盘文件, 加载到内存, 执行命令
4. 如果没有hash缓存, 则要去磁盘搜索$PATH变量, 从左到右依次查询每个路径, 如果能查到, 则将命令加载到内存执行, 如果找不到对应文件, 则报错, command not found
5. 当不同的路径包含相同名称的外部命令时, 会执行优先查询到的命令
2.4 内部命令和外部命令详解
为何优先执行内部命令?
内部命令集成在Shell里, 开启自动加载到内存
外部命令是磁盘文件, 执行时才加载到内存, 执行效率没有内部命令执行效率高, 所以内部命令执行优先级高
如果一个命令既有内部命令也有外部命令, 也是内部命令优先执行
因此,默认情况下, 如有一个命令既有内部也有外部命令, 那么外部命令是不会执行的
如果一个命令内部和外部命令都有, 想要强制使用外部命令, 只需要指明外部命令磁盘文件路径即可
比如: echo是内部命令, 也是外部命令
[20:40:33 root@centos8-2 ~]#type echo
echo is a shell builtin
[20:40:37 root@centos8-2 ~]#ll /bin/echo
-rwxr-xr-x. 1 root root 79480 Apr 10 04:53 /bin/echo
为何要设定某些命令既有外部命令也有内部命令?
内部命令依赖于所使用的的Shell,如果一个命令在bash Shell中是内部命令,但是在zsh中不是内部命令
那么就需要外部命令才能使用, 所以有些命令即是内部命令也是外部命令
避免由于Shell的不同造成有些内部命令无法使用
[20:29:51 root@centos8-2 ~]#echo $PATH
/data/scripts:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
如何分辨内部和外部命令?
type COMMAND
type -a COMMAND: 列出该命令的所有命令类型, 因为一个命令既可以是内部, 也可以是外部命令
type vs which
type能判断是内部命令,外部命令还是别名, 如果是外部命令, 也可以获取到外部命令的磁盘路径
which用来查看外部命令磁盘路径, 因为内部命令都是直接加载到内存的,没有磁盘文件
which和type都可以查出外部命令磁盘路径
[21:30:41 root@CentOS-8-1 ~]#type echo
echo is a shell builtin
[21:38:53 root@CentOS-8-1 ~]#type -a echo
echo is a shell builtin
echo is /usr/bin/echo
[21:38:56 root@CentOS-8-1 ~]#which echo
/usr/bin/echo
- 如何提高外部命令执行效率: hash缓存
外部命令执行时, 系统需要到PATH变量的目录中,从左到右依次查找每个目录,效率低,因此,在开机后, 系统第一次在某个PATH变量目录下找到某个外部命令时. 会把该磁盘路径缓存到内存, 该过程称为HASH. 下次再执行该外部命令时,直接在内存中查找缓存记录,拿到命令所在的磁盘目录,直接进到此目录中加载命令到内存,就不用从左到右依次搜索外部命令了. 但是, 一旦服务器重启, 那么此前的hash缓存就会全部丢失
hash: 列出目前被缓存在内存中外部命令的路径
[20:43:13 root@centos8-2 ~]#type hash
hash is a shell builtin # hash本身是内部命令
[20:53:53 root@centos8-2 ~]#hash
hits command
10 /usr/bin/ls
如果某个外部命令的磁盘路径hash缓存到了内存中, 此时我们把这个命令移动到别的目录中,那么使用该命令时就会出错
# 先执行一次hostname ,让hash产生缓存
[root@demo-c8 ~]# hostname
demo-c8.demo
[root@demo-c8 ~]# hash
hits command
1 /usr/bin/hostname
# 将/usr/bin/hostname移动到/usr/local/sbin下
[root@demo-c8 ~]# mv /usr/bin/hostname /usr/local/sbin
# 此时, 再次执行hostname, 就会报错, 找不到文件了, 因此此时hash缓存的还是修改之前的路径/usr/bin/hostname
[root@demo-c8 ~]# hash
hits command
1 /usr/bin/hostname
[root@demo-c8 ~]# hostname
-bash: /usr/bin/hostname: No such file or directory
解决方案: 清除缓存
- 只清除单个命令缓存记录
hash -d COMMAND
[root@demo-c8 ~]# hash -d hostname
[root@demo-c8 ~]# hash #-d, 只清除单个命令的缓存记录
hits command
[root@demo-c8 ~]# hostname # 命令可以正常执行, 因为系统会去PATH变量查找hostname命令
demo-c8.demo
[root@demo-c8 ~]# hash # 再次查看缓存, 可以看到此时执行hostname, 执行的是/usr/local/sbin/hostname
hits command
1 /usr/local/sbin/hostname
- 清除全部缓存
hash -r
- 退出重新登录终端, 所有缓存都会被清除
2.5 别名
如何判断一个单词是不是别名?
type WORD
[21:18:02 root@centos8-2 ~]#type grep
grep is aliased to `grep --color=auto'
[21:18:08 root@centos8-2 ~]#type mv
mv is aliased to `mv -i'
创建别名案例:
scandisk: 自定义别名,实现不关机直接扫描识别新添加的硬盘
[root@demo-c8 ~]#alias # 列出所有别名
alias scandisk='echo - - - > /sys/class/scsi_host/host0/scan;echo - - - > /sys/class/scsi_host/host1/scan;echo - - - > /sys/class/scsi_host/host2/scan'
...
...
# 当前磁盘情况
[root@demo-c8 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 40G 0 part /
├─sda3 8:3 0 2G 0 part [SWAP]
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 40G 0 part /data
sr0 11:0 1 7.7G 0 rom
-
不关机, 直接添加一块新的磁盘
# 添加新的磁盘后, 如果不执行scandisk, 或者不重启服务器的话是无法识别新添加的磁盘的
[root@demo-c8 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 40G 0 part /
├─sda3 8:3 0 2G 0 part [SWAP]
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 40G 0 part /data
sr0 11:0 1 7.7G 0 rom
# 此时, 行scandisk命令, 会自动识别出来新添加的磁盘
[root@demo-c8 ~]#scandisk
[root@demo-c8 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 40G 0 part /
├─sda3 8:3 0 2G 0 part [SWAP]
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 40G 0 part /data
sdb 8:16 0 50G 0 disk
sr0 11:0 1 7.7G 0 rom
2.5.1 临时创建/删除别名
alias/unalias NAME
2.5.2 持久保存别名
持久保存: 将临时命令添加到个人配置文件, ~/.bashrc, 但仅对当前登陆账户有效, 因为一般情况下别名都是个人设置.
如果想要对所有用户都有效, 就放到`/etc/bashrc`文件
使变更生效:
退出重新登录或者source ~/.bashrc 文件
source 和 . 是等价内部命令, 让修改的配置文件立即生效, 不需要重新登陆终端
2.6 如果定义的别名, 与原本的内部/外部命令冲突, 此时如何执行原本的命令
\ALIASNAME: 反斜线, 会执行别名后面的原始命令
[root@demo-c8 ~]# hostname # hostname原始命令会显示主机名
demo-c8.demo
[root@demo-c8 ~]# alias hostname="pwd" # 给pwd命令起个别名为hostname, 这样执行hostname, 就是执行pwd命令, 显示当前工作目录
[root@demo-c8 ~]# hostname
/root
[root@demo-c8 ~]# \hostname # 此时想要执行hostname原始命令, 就用反斜线+原始命令本身
demo-c8.demo
"ALIASNAME": "执行原始命令"
[root@demo-c8 ~]# "hostname"
demo-c8.demo
'ALIASNAME': '执行原始命令'
[root@demo-c8 ~]# 'hostname'
demo-c8.demo
command ALIASNAME: command 原始命令
[root@demo-c8 ~]# command hostname
demo-c8.demo
/path/to/command: 只适用于原始命令是外部命令的情况, 因为内部命令没有磁盘文件,是集成到shell的, 开机自动加载到内存
- Shell命令格式
COMMAND [OPTIONS] [ARGUMENTS]
options: 选项, 表示命令执行特征
argument: 参数, 表示命令作用对象
# 短选项: UNIX风格
[root@demo-c8 ~]# uname -r
4.18.0-193.el8.x86_64
# 长选项: GNU风格
[root@demo-c8 ~]# ls --all
. anaconda-ks.cfg .bash_profile .cache .cshrc Desktop Downloads .ICEauthority .local Pictures Public Templates .viminfo
.. .bash_logout .bashrc .config .dbus Documents .esd_auth initial-setup-ks.cfg Music .pki .tcshrc Videos .Xauthority
# BSD风格: 一个字母, 例如: a, 使用相对较少
[root@demo-c8 ~]# ps a
PID TTY STAT TIME COMMAND
1759 tty1 Ssl+ 0:00 /usr/libexec/gdm-wayland-session gnome-session --autostart /usr/share/gdm/greeter/autostart
1769 tty1 Sl+ 0:00 /usr/libexec/gnome-session-binary --autostart /usr/share/gdm/greeter/autostart
- 命令工具集: 把多个命令整合到一起
Shell命令可以包含子命令和子子命令, 比如ip命令
ip addr
ip route
...
...
- 一个命令分成多行执行
ho\
st\
name
- 多个命令放在一行执行
# 显示结果时, 会按照书写顺序换行显示
cmd1 ; cmd2 ; cmd3
[root@demo-c8 ~]# uname -r ; ls ; pwd
4.18.0-193.el8.x86_64
anaconda-ks.cfg Desktop Documents Downloads initial-setup-ks.cfg Music Pictures Public Templates Videos
/root
- 命令退出
ctrl +d / ctrl +c
+d 正常退出
+c 强行退出
3. 基础命令介绍
3.1 查看硬件信息
3.1.1 查看cpu信息
- lscpu: 查看cpu整体信息
[root@demo-c8 ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1 # 每个核心有几个线程
Core(s) per socket: 2 # 每个槽位有几个核心
Socket(s): 2 # 服务器面板上有几个cpu槽位
NUMA node(s): 1 # nodes的数量
Vendor ID: GenuineIntel
CPU family: 6
Model: 165
Model name: Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz
Stepping: 2
CPU MHz: 2303.998
BogoMIPS: 4607.99
Hypervisor vendor: VMware
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 16384K
NUMA node0 CPU(s): 0-3 # 对应的core
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xsaves arat pku ospke md_clear flush_l1d arch_capabilities
- cat /proc/cpuinfo: 查看每一个cpu核心的信息
[root@demo-c8 ~]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz
stepping : 2
microcode : 0xe2
cpu MHz : 2303.998
cache size : 16384 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xsaves arat pku ospke md_clear flush_l1d arch_capabilities
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit
bogomips : 4607.99
clflush size : 64
cache_alignment : 64
address sizes : 43 bits physical, 48 bits virtual
power management:
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz
stepping : 2
microcode : 0xe2
cpu MHz : 2303.998
cache size : 16384 KB
physical id : 0
siblings : 2
core id : 1
cpu cores : 2
apicid : 1
initial apicid : 1
fpu : yes
fpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xsaves arat pku ospke md_clear flush_l1d arch_capabilities
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit
bogomips : 4607.99
clflush size : 64
cache_alignment : 64
address sizes : 43 bits physical, 48 bits virtual
power management:
processor : 2
vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz
stepping : 2
microcode : 0xe2
cpu MHz : 2303.998
cache size : 16384 KB
physical id : 1
siblings : 2
core id : 0
cpu cores : 2
apicid : 2
initial apicid : 2
fpu : yes
fpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xsaves arat pku ospke md_clear flush_l1d arch_capabilities
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit
bogomips : 4607.99
clflush size : 64
cache_alignment : 64
address sizes : 43 bits physical, 48 bits virtual
power management:
processor : 3
vendor_id : GenuineIntel
cpu family : 6
model : 165
model name : Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz
stepping : 2
microcode : 0xe2
cpu MHz : 2303.998
cache size : 16384 KB
physical id : 1
siblings : 2
core id : 1
cpu cores : 2
apicid : 3
initial apicid : 3
fpu : yes
fpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xsaves arat pku ospke md_clear flush_l1d arch_capabilities
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit
bogomips : 4607.99
clflush size : 64
cache_alignment : 64
address sizes : 43 bits physical, 48 bits virtual
power management:
3.1.2 查看内存大小
- free: 查看内存大小
[root@demo-c8 ~]# free
total used free shared buff/cache available
Mem: 7970840 781836 6674596 11176 514408 6922264
Swap: 2097148 0 2097148
[root@demo-c8 ~]# free -m
total used free shared buff/cache available
Mem: 7784 763 6518 10 502 6760
Swap: 2047 0 2047
[root@demo-c8 ~]# free -h
total used free shared buff/cache available
Mem: 7.6Gi 763Mi 6.4Gi 10Mi 502Mi 6.6Gi
Swap: 2.0Gi 0B 2.0Gi
3.1.3 查看硬盘和分区情况
- lsblk
oot@demo-c8 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 40G 0 part /
├─sda3 8:3 0 2G 0 part [SWAP]
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 40G 0 part /data
sdb 8:16 0 50G 0 disk
sr0 11:0 1 7.7G 0 rom
3.1.4 查看内核版本
[root@demo-c8 ~]# uname -r
4.18.0-193.el8.x86_64
3.1.5 查看操作系统发行版
- cat /etc/os-release: 各种Linux发行版通用命令
[root@demo-c8 ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="8 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="8"
- cat /etc/redhat-release: 红帽系列专用
[root@demo-c8 ~]# cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
- lsb_release -a
仅适用于红帽系列发行版, 查看操作系统版本信息,需要安装相应的包redhat-lsb-core-4.1-47.el8.x86_64
才可以, 该命令显示的结果来自/etc/redhat-release
文件, 因此可以修改该文件,来修改lsb_release -a命令显示的结果, 隐藏系统版本
[root@demo-c8 ~]# lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 8.5.2111
Release: 8.5.2111
Codename: n/a
3.2 日期和时间
- date: 显示当前系统时间
[root@demo-c8 ~]# date
Wed Aug 17 10:16:43 CST 2022
- %s: 显示UNIX时间
[root@demo-c8 ~]# date +%s
1660702612
- date -d @UNIX时间: 根据UNIX时间, 显示正常时间
[root@demo-c8 ~]# date -d @1660702612
Wed Aug 17 10:16:52 CST 2022
- %F: 显示年月日, %T: 显示时分秒
[root@demo-c8 ~]# date "+%F %T"
2022-08-17 10:19:10
- clock : 显示硬件时间, 硬件时间记录在主板芯片里, 通过电池来记录硬件时间. 即使电脑关机, 主板芯片中的电池也会持续记录时间. 只要电池有电, 就可以一直记录时间. 服务器一般在服务期限内, 不会出现电池没电的情况. 实际生成环境, 会使用时间同步的软件, 达到服务器集群时间同步的目的
-s 以硬件时间为准, 校正软件时间
-w 以软件时间为主,校正硬件时间
date: 显示系统时间, 操作系统启动后, 会先获取硬件时间, 作为系统时间, 之后系统时间就会独立计时, 不再依靠硬件时间
date: 经常用来生成指定格式的文件名称, 通常与备份脚本配合使用
[21:06:42 root@demo-c8 ~]#date -d "-1 day" "+%F %T"
2022-08-16 21:06:47
[root@demo-c8 ~]# clock
2022-08-17 10:31:37.383050+08:00
[root@demo-c8 ~]# date
Wed Aug 17 10:31:41 CST 2022
- 校正时间案例
# 修改系统时间
[root@demo-c8 ~]# date 082020302021.20
Fri Aug 20 20:30:20 CST 2021
[root@demo-c8 ~]# date
Fri Aug 20 20:30:22 CST 2021
# 通过硬件时间校正系统时间
[root@demo-c8 ~]# clock
2022-08-17 10:42:31.164231+08:00
[root@demo-c8 ~]# clock -s
[root@demo-c8 ~]# date
Wed Aug 17 10:42:42 CST 2022
查看和设置时区
/etc/timezone: 适用于Ubuntu系统
root@u18:~# cat /etc/timezone
Asia/Harbin
- /etc/localtime: 适用于红帽系统
[root@demo-c8 ~]# ll /etc/localtime
lrwxrwxrwx. 1 root root 35 Aug 15 17:05 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai
- 设置系统时区: 本质修改的就是
/etc/localtime
链接的快捷方式
[root@demo-c8 ~]# timedatectl set-timezone UTC
[root@demo-c8 ~]# ll /etc/localtime
lrwxrwxrwx. 1 root root 25 Aug 17 02:45 /etc/localtime -> ../usr/share/zoneinfo/UTC
[root@demo-c8 ~]# date # 修改时区后, 软件时间会按照设定的时区的时间显示
Wed Aug 17 02:45:53 UTC 2022
[root@demo-c8 ~]# timedatectl set-timezone Asia/Shanghai
[root@demo-c8 ~]# ll /etc/localtime
lrwxrwxrwx. 1 root root 35 Aug 17 10:46 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai
[root@demo-c8 ~]# date
Wed Aug 17 10:46:56 CST 2022
- 显示日历
[root@demo-c8 ~]# cal -y
2022
January February March
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 1 2 3 4 5 1 2 3 4 5
2 3 4 5 6 7 8 6 7 8 9 10 11 12 6 7 8 9 10 11 12
9 10 11 12 13 14 15 13 14 15 16 17 18 19 13 14 15 16 17 18 19
16 17 18 19 20 21 22 20 21 22 23 24 25 26 20 21 22 23 24 25 26
23 24 25 26 27 28 29 27 28 27 28 29 30 31
30 31
3.3 关机和重启
3.3.1 关机
- 立即关机
poweroff
- 稍后关机
shutdown now: 立刻关机
shutdown +5: 五分钟后关键, 以分钟为单位
shutdown hh:mm: 指定具体几点几分关机
shutdown -c: 取消预订关机计划
3.3.2 重启
reboot
3.4 用户登录信息查看命令
who: 查看所有终端用户登录信息
whoami: 只看本终端登录用户信息
w: 查看所有终端用户登录信息, 并且显示正在执行的命令
who am i: 查看当前登录用户的登录信息, 包含用户名, 终端信息, 登录时间
[22:05:55 root@centos8-2 ~]#whoami #只看本终端登录用户信息
root
[root@demo-c8 ~]# who #查看所有终端用户登录信息
root pts/0 2022-08-17 10:54 (10.0.0.1) # SSH
wang tty2 2022-08-17 10:54 (tty2) # VMware登录
[22:07:32 root@centos8-2 ~]#w #查看所有终端用户登录信息, 并且显示正在执行的命令
22:07:35 up 1:58, 2 users, load average: 0.25, 0.07, 0.04
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 21:48 6.00s 0.12s 0.00s w
root pts/1 10.0.0.1 22:07 11.00s 0.46s 0.44s yes
3.5 会话管理命令
3.5.1 screen
screen命令: 当执行耗时较长的命令,比如备份,安装程序,跑脚本时,如果本地SSH断开了或者会话窗口被关闭了,那么该命令也就终止了,即使再次进行ssh连接也不能恢复执行, 因此可以使用screen命令. 即使本地SSH断开, 或者会话窗口被关闭, 也不影响正在执行的命令
在执行命令前,先执行screen命令,然后再执行其他命令.这样即使当前会话被意外关闭,正在执行的命令也还会继续执行, 当再次登录到系统时可以发现此前的命令仍在执行
也可以用screen -r
恢复此前意外关闭的在screen中执行的命令,来查看其执行情况
- 案例: screen
先在会话1执行yes命令, 该命令会在终端不断打印字母y
-
在会话1持续打印字母y时, 打开第二个会话, 通过
ps aux
获取到yes命令的进程id
-
关闭会话1, 此时, 再次在会话2查看当前进行, 发现yes命令的进程9077已经结束了
重新开启一个会话, 先执行screen命令
[root@demo-c8 ~]# screen
[root@demo-c8 ~]# yes
-
在另一个会话中, 获取yes命令的进程id
-
关闭运行yes的会话窗口, 在另一个会话中, 执行
ps aux
, 发现yes命令仍在运行
此时, 在任意窗口执行
screen -r
命令, 可以恢复查看在screen窗口中执行的命令输出情况输入screen后, 所有的窗口都会运行在screen模式, 需要执行
exit
才能退出screen
3.5.2 tmux
tmux也能实现上述功能,而且功能更加强大, 并且tmux可以把一个会话窗口分屏
[root@demo-c8 ~]# yum -y install tmux
- 功能1: 和screen一样, 防止执行的命令因为会话关闭而终止
在窗口执行tmux命令, 进入tmux
执行命令
- 功能2: 分离出多个窗口
先在一个窗口执行tmux进入tmux模式
再通过快捷键创建多个窗口
需要关闭某个窗口时, 就切换到这个窗口, 执行exit命令
3.6 echo命令
echo -n STRING 不自动换行, 否则默认会换行
echo -e "\a" 响声音, 需要长时间执行的命令, 可以在程序/命令结束后, 加一个响声音, 这样就知道命令什么时候运行完了
echo 直接执行echo, 就是换行
[22:07:35 root@centos8-2 ~]#echo -e "a\tb" # \t制表符
a b
[22:30:13 root@centos8-2 ~]#echo -e "a\nb" \n换行符
a
b
3.7 命令行扩展和被括起来的集合
3.7.1 `CMD`和$(CMD)
`CMD` , $(CMD): 2者等价, 当一个命令A需要引用另一个命令B的结果时使用, 这里CMD必须是能返回结果的, 如果不返回结果, 比如 ls /data一个空目录时, 是不返回结果的,也就没有意义.
如果反引号内的命令不存在, 那么直接会显示内部的命令command not found. 如果执行的结果为空, 那么最终的结果为空
[root@demo-c8 ~]# echo `111`
bash: 111: command not found..
反引号,$(): 既可以扩展变量, 也可以扩展命令
反引号会先把内部的$变量
进行翻译, 转换为正常的字符, 然后再执行反引号内部的命令.
.1 $PATH是环境变量, 那么在反引号内被翻译后的值就是环境变量路径/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
.
- 下一步, 因为反引号内部是echo命令, 所以会执行
echo /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
, 得到的结果就是/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
- 最后, 最外层的echo执行, 返回
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@demo-c8 ~]# echo `echo $PATH`
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[23:14:09 root@centos8-2 ~]#echo my name is `whoami`
my name is root
[23:14:21 root@centos8-2 ~]#echo my name is $(whoami)
my name is root
另外, 也可以利用反引号命令或$(CMD), 将命令的执行结果赋值给某个变量, 在脚本中经常使用
[23:14:27 root@centos8-2 ~]#NAME=$(whoami)
[23:16:07 root@centos8-2 ~]#echo $NAME
root
3.7.2 双引号
双引号可以直接扩展变量, 但是不会扩展命令, 会把命令当做字符串处理
双引号将变量扩展后, 内部剩的内容就是普通字符串
[23:17:28 root@centos8-2 ~]#echo "echo $PATH"
echo /data/scripts:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[23:17:54 root@centos8-2 ~]#echo 'echo $PATH'
echo $PATH
[23:18:51 root@centos8-2 ~]#echo `echo $PATH`
/data/scripts:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[23:18:54 root@centos8-2 ~]#echo "hostname"
hostname
3.7.3 单引号
单引号既不识别变量, 也不识别命令, 单引号内部是什么, 就输出什么. 一般在修改环境变量或者修改别名时用echo ''
, 这样会把echo
的内容原封不动追加到配置文件
- 无论是单引号还是双引号还是反引号, 都需要成对出现
3.7.4 花括号
花括号扩展是按照ASCII码表的顺序取值, 可以取连续值, 也可以取离散值
- 取连续值{起始值..结束值}
[root@demo-c8 ~]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@demo-c8 ~]# echo {A..z} # ASCII码表顺序
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@demo-c8 ~]# echo {a..Z} # 如果起始值和结束值是反向的, 那么就反向取值
a ` _ ^ ] [ Z
ASCII码表顺序:
标点符号
0-9
标点符号
A-Z
标点符号
a-z
标点符号
- 取离散值
[root@demo-c8 ~]# echo {1..10..2} # 2为步长, 2表示每隔一位取一次值
1 3 5 7 9
[root@demo-c8 ~]# echo {000..10..2}
000 002 004 006 008 010
[root@demo-c8 ~]# echo {000..20..2}
000 002 004 006 008 010 012 014 016 018 020
[root@demo-c8 ~]# echo {000..020..2}
000 002 004 006 008 010 012 014 016 018 020
- 花括号还可以实现重复打印字符串, 比如生成多个有规律的文件名
[root@demo-c8 ~]# echo file{1..5}
file1 file2 file3 file4 file5
[root@demo-c8 ~]# echo file{1..5}.{log,txt}
file1.log file1.txt file2.log file2.txt file3.log file3.txt file4.log file4.txt file5.log file5.txt
[root@demo-c8 ~]# echo file{1..5}.log
file1.log file2.log file3.log file4.log file5.log
3.8 tab键补全
3.8.1 命令补全
命令补全需要安装bash-completion
包
3.8.2 路径补全
3.8.3 双击tab键
3.9 命令行历史
用户命令的历史保存在两个位置, 一个是内存, 通过history
命令查看
另一个是在用户家目录.bash_history
文件, 用户退出时会把内存中的命令保存到该目录,下次再登录时自动将该目录内的命令加载到内存命令历史中, 这样通过hitstory
即可查看
用户登录到Shell时, 会读取命令历史文件中记录的命令, 然后加载到内存.
用户登录到Shell后, 新执行的命令只会记录在内存的缓冲区, 这些命令会在用户正常退出时, 追加
到命令历史文件中, 也就是用户家目录下的.bash_history
文件
3.10 调用命令行历史
history输出结果中的命令, 可以直接被调用执行
history -c 删除历史命令, 但是只删除的是内存中的历史
彻底清除历史命令: 清除内存, 清除文件
设置命令历史显示执行时间和执行用户
# ~/.bash_file仅对当前用户生效, 如果想对所有用户生效就要放到/etc/profile文件
# 但是, 显示的执行命令和用户信息, 只是当前登录用户的, 看不到其他登录用户执行的命令
[23:49:05 root@centos8-2 ~]#vim .bash_profile
export HISTTIMEFORMAT="%F %T `whoami` "
[root@demo-c8 ~]# history
1 2022-08-17 19:08:06 root ll /bin/bash
2 2022-08-17 19:08:06 root type enable
3 2022-08-17 19:08:06 root type help
4 2022-08-17 19:08:06 root echo $PATH
5 2022-08-17 19:08:06 root type /bin/echo
6 2022-08-17 19:08:06 root xx
7 2022-08-17 19:08:06 root hash
调用历史命令
!n: 执行history命令输出结果中对应序号n的命令
!-: 执行history命令输出结果中, 倒数第n个命令
!:0, 执行前一条命令,但是不包含参数
!!, 执行上一条完整命令,包含参数
!*, 调用前一个命令所有参数
[23:49:56 root@centos8-2 ~]#ls /data
prac scripts testing_scripts
[23:51:41 root@centos8-2 ~]#!:0
ls
anaconda-ks.cfg test.txt
如何在当前命令中调用前一个命令的最后一个参数作为本命令的参数
CMD !$
[root@demo-c8 ~]# ls anaconda-ks.cfg
anaconda-ks.cfg
[root@demo-c8 ~]# mv !$ anaconda-ks.cfg.bak
mv anaconda-ks.cfg anaconda-ks.cfg.bak # 显示要执行的命令
[root@demo-c8 ~]# ls
anaconda-ks.cfg.bak asicc.txt.txt Desktop Documents Downloads initial-setup-ks.cfg Music Pictures Public Templates test.txt 't.txt'$'\033'':Q!' Videos
3.11 bash命令行的快捷键
ctrl+s: 阻止屏幕输入, 在屏幕输入命令不会显示, 执行命令的结果也不会显示
ctrl+q: 解除锁定, 会显示在锁定期间的所有输入和输出内容
ctrl+r: 搜索history中以某关键字为命令的命令
ctrl+u 删除光标所在处前面的所有内容
ctrl+k 删除光标处后包括光标所在位置的全部内容
alt+r 删除整行
ctrl+a: 将光标移动到命令行行首, 相当于Home键
ctrl+e: 将光标移动到命令行行位, 相当于End
- ctrl+r案例
-
终端按ctrl+r
-
输入要搜索的命令的关键字
- 按上下键查看, 找到要执行的命令
- 按回车执行
- Alt组合键经常和其他软件冲突, 可以再Xshell中设置Alt键为Meta键
- Xshell设置左键复制, 右键粘贴
4 字符集和编码
4.1 ASCII码
ASCII: 7个bit位, 表示128个字符, 通过man ascii
可以查看
[root@demo-c8 ~]# man ascii
- 案例: ASCII码
# 编辑一个测试文本
[22:35:13 root@centos8-2 ~]#vim test.txt
A
B
c
字符在计算机内部都是以2进制数存储, 我们可以使用hexdump命令, 将存储的文本字符以16进制展示出来
hexdump -C 将文件以16进制格式转换输出
-C, --canonical canonical hex+ASCII display
[root@demo-c8 ~]# hexdump -C test.txt
00000000 41 0a 42 0a 63 0a |A.B.c.|
00000006
ASCII中0a代表换行, ASCII中0d代表回车
0a是换行\n的16进制结果, 0d是回车\r的16进制结果
Linux只有换行0a, 它将回车和换行两个功能放一起了, 用符号/n表示
Windows既有换行也有回车, Windows中, /n表示换行 /r表示回车
Windows中先执行回车再执行换行, 回车是回到当前行行首, 换行是切换到当前位置下一行
-
在Windows记事本中写入ABc三个字母, 然后在Linux中用hexdump查看其16进制展示结果
[root@demo-c8 ~]# cat asicc.txt.txt
A
B
c[root@demo-c8 ~]# hexdump -C asicc.txt.txt
00000000 41 0d 0a 42 0d 0a 63 |A..B..c|
00000007 #可以看出, Windows先执行0d回车, 再执行0a换行
4.2 Unicode
- 由于ASCII仅能表示128个字符, 不满足全世界人类语言, 因此, 推出了Unicode编码
- Unicode只是定义了内存中文字和二进制的对应关系, 但是并没有规定文字在磁盘和网络传输中具体如果存储, 比如一个字符占几个字节
- 因此, 后续又推出了Unicode编码对应的存储方案, 也就是UTF字符集
UTF-8: 可变长, 一个字符占1-4个字节, UTF-8, 一个英文字符占一个字节, 一个汉字字符占3-4个字节
UTF-16: 可变长, 一个字符占2或4个字节
UTF-32: 固定长度, 一个字符占4个字节
Unicode是一种字符集, 并不提供编码方案
UTF-8, UTF-16和UTF-32是Unicode字符集的编码方案
ASCII即是字符集也提供了编码方案
- echo $LANG: 查看系统使用的字符集和编码方案
[root@demo-c8 ~]# echo $LANG
en_US.UTF-8
- en_US表示终端命令提示信息使用哪种语言. 可以修改LANG变量来修改提示语言
[root@demo-c8 ~]# LANG=zh_CN.UTF-8
- 编辑记事本时是在内存中运行,用的是Unicode, 所以不会乱码, 因为Unicode和各种字符编码都有对照关系, 而一旦保存到磁盘就会转换成文本编辑器设定的保存时使用的字符编码格式. 因此, 读取和写入需要使用相同的字符串编码格式, 否则就会乱码
获取帮助
1. whatis
1.1 介绍
whatis使用数据库来显示命令的简短描述, 此工具在系统刚安装后, 不可立即使用, 需要生成数据库后才可以使用
# CentOS7版本以后
执行mandb命令
# CentOS6版本以前
执行makewhatis命令
# 系统安装后, 一段时间后, 数据库会自动生成, 但是需要等多久就不确定了
[20:40:50 root@demo-c8 ~]#whatis rm
rm (1) - remove files or directories # 1是分类号, 文档按照作用会被分为若干类
rm (1p) - remove directory entries # p是给开发人员用的文档
1.2 whatis vs which vs whereis
[23:38:21 root@centos8-2 /data/prac]#which hostname #which查看外部命令所在文件路径
/usr/bin/hostname
[23:38:26 root@centos8-2 /data/prac]#whatis hostname #查看命令简要说明,及man帮助信息
hostname (1) - show or set the system's host name
hostname (5) - Local hostname configuration file
hostname (7) - hostname resolution description
[23:38:29 root@centos8-2 /data/prac]#whereis hostname #查找与该命令相关的所有文件的所在位置
hostname: /usr/bin/hostname /etc/hostname /usr/libexec/hostname /usr/share/man/man1/hostname.1.gz /usr/share/man/man5/hostname.5.gz /usr/share/man/man7/hostname.7.gz
2. 查看命令的帮助
2.1 内部命令帮助
- help COMMAND
- man bash
[root@demo-c8 ~]# type history
history is a shell builtin
[root@demo-c8 ~]# help history
history: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...]
Display or manipulate the history list.
Display the history list with line numbers, prefixing each modified
entry with a `*'. An argument of N lists only the last N entries.
Options:
-c clear the history list by deleting all of the entries
-d offset delete the history entry at position OFFSET.
-a append history lines from this session to the history file
-n read all history lines not already read from the history file
and append them to the history list
-r read the history file and append the contents to the history
list
-w write the current history to the history file
-p perform history expansion on each ARG and display the result
without storing it in the history list
-s append the ARGs to the history list as a single entry
If FILENAME is given, it is used as the history file. Otherwise,
if HISTFILE has a value, that is used, else ~/.bash_history.
If the HISTTIMEFORMAT variable is set and not null, its value is used
as a format string for strftime(3) to print the time stamp associated
with each displayed history entry. No time stamps are printed otherwise.
Exit Status:
Returns success unless an invalid option is given or an error occurs.
2.2 外部命令帮助
COMMAND --help 或者 COMMAND -h
使用man手册: man COMMAND
信息页: info COMMAND
程序自身帮助文档: README, INSTALL, ChangeLog
程序官方文档
相关网站
搜索引擎
2.3 --help或-h选项
显示用法总结和参数列表, 大多数命令适用, 但并非所有
[root@demo-c8 ~]# date -h
date: invalid option -- 'h'
Try 'date --help' for more information.
[root@demo-c8 ~]# date --help
Usage: date [OPTION]... [+FORMAT]
or: date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
Display the current time in the given FORMAT, or set the system date.
Mandatory arguments to long options are mandatory for short options too.
-d, --date=STRING display time described by STRING, not 'now'
--debug annotate the parsed date,
and warn about questionable usage to stderr
-f, --file=DATEFILE like --date; once for each line of DATEFILE
-I[FMT], --iso-8601[=FMT] output date/time in ISO 8601 format.
FMT='date' for date only (the default),
'hours', 'minutes', 'seconds', or 'ns'
for date and time to the indicated precision.
Example: 2006-08-14T02:34:56-06:00
-R, --rfc-email output date and time in RFC 5322 format.
Example: Mon, 14 Aug 2006 02:34:56 -0600
--rfc-3339=FMT output date/time in RFC 3339 format.
FMT='date', 'seconds', or 'ns'
for date and time to the indicated precision.
Example: 2006-08-14 02:34:56-06:00
-r, --reference=FILE display the last modification time of FILE
-s, --set=STRING set time described by STRING
-u, --utc, --universal print or set Coordinated Universal Time (UTC)
--help display this help and exit
--version output version information and exit
FORMAT controls the output. Interpreted sequences are:
%% a literal %
%a locale's abbreviated weekday name (e.g., Sun)
%A locale's full weekday name (e.g., Sunday)
%b locale's abbreviated month name (e.g., Jan)
%B locale's full month name (e.g., January)
%c locale's date and time (e.g., Thu Mar 3 23:05:25 2005)
%C century; like %Y, except omit last two digits (e.g., 20)
%d day of month (e.g., 01)
%D date; same as %m/%d/%y
%e day of month, space padded; same as %_d
%F full date; same as %Y-%m-%d
%g last two digits of year of ISO week number (see %G)
%G year of ISO week number (see %V); normally useful only with %V
%h same as %b
%H hour (00..23)
%I hour (01..12)
%j day of year (001..366)
%k hour, space padded ( 0..23); same as %_H
%l hour, space padded ( 1..12); same as %_I
%m month (01..12)
%M minute (00..59)
%n a newline
%N nanoseconds (000000000..999999999)
%p locale's equivalent of either AM or PM; blank if not known
%P like %p, but lower case
%q quarter of year (1..4)
%r locale's 12-hour clock time (e.g., 11:11:04 PM)
%R 24-hour hour and minute; same as %H:%M
%s seconds since 1970-01-01 00:00:00 UTC
%S second (00..60)
%t a tab
%T time; same as %H:%M:%S
%u day of week (1..7); 1 is Monday
%U week number of year, with Sunday as first day of week (00..53)
%V ISO week number, with Monday as first day of week (01..53)
%w day of week (0..6); 0 is Sunday
%W week number of year, with Monday as first day of week (00..53)
%x locale's date representation (e.g., 12/31/99)
%X locale's time representation (e.g., 23:13:48)
%y last two digits of year (00..99)
%Y year
%z +hhmm numeric time zone (e.g., -0400)
%:z +hh:mm numeric time zone (e.g., -04:00)
%::z +hh:mm:ss numeric time zone (e.g., -04:00:00)
%:::z numeric time zone with : to necessary precision (e.g., -04, +05:30)
%Z alphabetic time zone abbreviation (e.g., EDT)
By default, date pads numeric fields with zeroes.
The following optional flags may follow '%':
- (hyphen) do not pad the field
_ (underscore) pad with spaces
0 (zero) pad with zeros
^ use upper case if possible
# use opposite case if possible
After any flags comes an optional field width, as a decimal number;
then an optional modifier, which is either
E to use the locale's alternate representations if available, or
O to use the locale's alternate numeric symbols if available.
Examples:
Convert seconds since the epoch (1970-01-01 UTC) to a date
$ date --date='@2147483647'
Show the time on the west coast of the US (use tzselect(1) to find TZ)
$ TZ='America/Los_Angeles' date
Show the local time for 9AM next Friday on the west coast of the US
$ date --date='TZ="America/Los_Angeles" 09:00 next Fri'
GNU coreutils online help:
Full documentation at:
or available locally via: info '(coreutils) date invocation'
2.4 man命令
man命令通过搜索在配置文件中定义的搜索路径来查找手册, 自行研发的软件需要把man手册放在对应目录里
man手册就是文档压缩包, man命令把对应文件解压打开/usr/share/man
[21:06:47 root@demo-c8 ~]#whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
几乎每个命令都有man帮助页面
- man章节
man1: 用户命令
man2: 系统调用
man3: C库调用
man4: 设备文件及特殊文件
man5: 配置文件格式
man6: 游戏
man7: 咋想
man8: 管理类的命令
man9: Linux内核API
- 先通过
whatis
去查看某个命令一共有几个man章节, 然后再选择特定的章节查看
openssl-passwd (1ssl) - compute password hashes
passwd (1) - update user's authentication tokens
passwd (5) - password file
[21:18:28 root@demo-c8 ~]#man 1 passwd
- man命令的配置文件, 定义了man文档的搜索路径
# CentOS6以前, man的配置文件
/etc/man.config
# CentOS7之后, man的配置文件
/etc/man_db.conf
# Ubuntu man的配置文件
/etc/manpath.config
-
如果想让man显示自己开发的帮助文档, 那么就添加自定义的文档保存路径到配置文件中, 然后执行
mandb
命令, 使配置文件生效
最小化安装时, 需要安装man包
yum -y install man-pages
- man快捷键
#n: 跳转到第n行
1G: 回到文件顶部
G: 跳转至文件末尾
/关键字: 搜索以指定字符串关键字, 从当前位置向文件尾部搜索, 不区分大小写
搜索后, 按n: 跳到下一个, 按N: 回到上一个
?关键字: 搜索以指定字符串关键字, 从当前位置, 向文件顶部搜索, 不区分大小写
n: 跟搜索方向同方向
N: 跟搜索方向反方向
2.5 info命令
man常用于命令参考, info使用通用文档参考
info命令没有参数, 直接列出一个命令的所有文档
info页面结构就像一个网站
每一页分为"节点"
链接节点之前"*"
- 命令格式:
info 命令
- info快捷键
方向键: 导航
Tab键: 移动到下一个链接
d: 显示主题目录
Home: 显示主题首部
Enter: 进入选定链接
n/p/u/l: 进入下/前/上一层/最后一个链接
s: 文字, 文本搜索
q: 退出info
- 练习
- 显示当前时间, 格式: 2016-06-18 10:20:30
[root@demo-c8 ~]# date "+%F %T"
2022-08-17 20:07:57
- 显示前天是星期几
[root@demo-c8 ~]# date --date="-1day" # -1day是昨天
Tue Aug 16 20:10:26 CST 2022
[root@demo-c8 ~]# date --date="day" # day表示明天
Thu Aug 18 20:10:29 CST 2022
[root@demo-c8 ~]# date # date显示今天
Wed Aug 17 20:10:34 CST 2022
[root@demo-c8 ~]# date --date='-2day' # -2day表示前天
Mon Aug 15 20:11:05 CST 2022
# date -d "STRING" = date --date="STRING"
Mon Aug 15 20:11:05 CST 2022
[root@demo-c8 ~]# date -d "-2day"
Mon Aug 15 20:11:35 CST 2022
- 设置当前日期为2019-08-07 06:05:10
[root@demo-c8 ~]# date 080706052019.10
Wed Aug 7 06:05:10 CST 2019
[root@demo-c8 ~]# date
Wed Aug 7 06:05:13 CST 2019
- 通过硬件时间校正系统时间
clock -s