第一天笔记

vim编辑器

vim编辑器介绍

每一个系统管理员都有一个偏爱的文本编辑器。有的管理员偏爱gedit,有的偏爱nano,甚至有的偏爱emacs。即使已经有偏爱的编辑器,了解vim还是有必要的。因为vim可以安装在任何系统。

vim版本,Linux 系统中可以安装vim三个不同版本:

vim-minimal:只提供vi和相关命令。

vim-enhanced:提供vim命令,提供语法高亮拼写检查等特性。

vim-X11:提供gvim,图形界面下的vim。gvim包涵菜单栏。当用户不知道命令的时候,可以通过菜单操作。

# 安装 vim 工具
[root@centos7 ~]# yum install vim
vim 模式
  • command 模式:该模式下键盘中的字母有特殊含义。例如G,跳转到最后一行;gg,跳转到第一行。

  • edit 模式:在 command 模式下按 i ,进入该模式。在该模式可以输入内容。在该模式下按Esc 返回 command 模式。

  • extended command 模式:在 command 模式下按 : ,进入该模式。在该模式下,可以保存文件(:w),退出编辑(:q),强制退出编辑(:q!),报错并退出(:wq)。

  • visual edit 模式:在 command 模式下按 v(单个字符选中)、V(整行选中)或者ctrl+v(按矩形选中),进入该模式。在该模式下,用于选中文件,随后可以复制或删除选中的内容。

[laoma@centos7 ~]$ cp /etc/profile ./profile.sh
[laoma@centos7 ~]$ vim ./profile.sh
命令行模式快捷键
定位文件内容
  • w ,向后1个word(光标在单词开头); e ,向后1个word(光标在单词末尾)

  • b ,向前1个word

  • ^ 或 0 ,行首

  • $ ,行尾

  • ( ,上一个句子头部; ) ,下一个句子尾部。

  • { ,上一个自然段; } ,下一个自然段。

  • gg ,第一行; G ,最后一行。

进入插入模式
  • i ,当前位置插入。(insert)

  • I,行首插入。

  • a,当前位置追加。(append)

  • A,行末追加。

  • o,向下新开一个空白行。

  • O,向上新开一个空白行。

复制:yy,复制1行,相当于y1y。以此类推 y2y y2w y2b。

粘贴:p 当前位置后粘贴,P 当前位置前粘贴

删除:

  • x,删除当前单个字符。5x,删除当前字符和后续4个字符。

  • X,删除前一单个字符。

  • dw,删除1个word,以此类推 d5w d3b d2d d$。

  • D,从当前删除到最后,相当于d$。

回退:

  • u,撤销上一个操作。

  • U,撤销整行修改。

修改,相当于删除后插入:

  • s,删除当前字符,并进入编辑模式。

  • S,删除当前行,并进入编辑模式。

  • c,代表替换动作,例如cw,删除1个word,并进入编辑模式。以此类推 c5w。

  • C,从当前删除到最后,并进入编辑模式。

替换:

  • r,替换单个字符后回退到命令行模式。

  • R,替换模式,一直替换直到按 Ese 返回命令行模式。

vim 配置

两个位置:

  • 全局: /etc/vimrc ,给所有用户设置一些默认值。

  • 用户: ~/.vimrc ,特定用户的个性化设置。

常见的设置命令:

[laoma@centos7 ~]$ vim ~/.vimrc
set number
set showcmd
set ai ts=2
set cursorcolumn
set cursorline
# 参数说明:
# 显示行号 set number
# 显示操作命令 set showcmd
# ai,自动缩进;ts,tabspace使用2个空格代替 set ai ts=2
# 列高亮对齐显示 set cursorcolumn
# 行高亮对齐显示 set cursorline

Linux输入输出重定向

Linux输入输出重定向介绍

核心是“标准流(Standard Streams)” 的概念,用于描述进程如何与外部(如键盘、屏幕、文件)进行数据交互。

标准流的核心组成

stdin**(标准输入,编号** 0**)**:

  • 是进程接收输入数据的通道,默认连接到键盘,程序通过它读取用户输入(如scanf 、 read 等操作会从 stdin 获取数据)。

  • 用法为仅读取(只能从该通道输入数据到进程)。

stdout**(标准输出,编号** 1**)**:

  • 是进程输出正常结果的通道,默认连接到终端屏幕,程序的普通打印(如 printf 、echo 等)会输出到 stdout 。

  • 用法为仅写入(进程只能向该通道输出数据)。

stderr**(标准错误,编号** 2**)**:

  • 是进程输出错误信息的通道,默认也连接到终端屏幕,用于区分正常输出和错误提示(如程序崩溃、逻辑错误的提示信息)。

  • 用法为仅写入(专门用于输出错误内容)。

3+ 号通道(其他文件,filename

  • 代表进程与自定义文件的交互通道(非标准流),没有默认连接,需要手动指定文件。

  • 用法为读取和 / 或写入(可根据需求对文件进行读、写操作)。

流程逻辑
  • 输入:用户通过键盘向 stdin 输入数据,进程从 stdin 读取这些输入。

  • 输出:进程将正常结果写入 stdout ,错误信息写入 stderr ,两者默认都显示在终端;同时,进程也可通过 3+ 号通道与其他文件进行数据的读写交互。

标准输出重定向到文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

# 查找 /etc 目录下 文件名是passwd的所有文件
[laoma@centos7 ~]$ find /etc -name 'passwd'
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/grub.d’: 权限不够
/etc/pam.d/passwd
/etc/passwd
find: ‘/etc/dhcp’: 权限不够
find: ‘/etc/lvm/archive’: 权限不够
find: ‘/etc/lvm/backup’: 权限不够
.......
# 将找到的文件名清单覆盖写入到passwd.list文件中
[laoma@centos7 ~]$ find /etc -name 'passwd' 1>passwd.list
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/grub.d’: 权限不够
......
[laoma@centos7 ~]$ cat passwd.list
/etc/pam.d/passwd
/etc/passwd
# 补充说明
# 1>passwd.list可简写为>passwd.list
# 1和>之间不能有空格
# 将多个文件内容合并为1个
[laoma@centos7 ~]$ cat /etc/fstab /etc/hosts > allinone
# 将找到的文件名清单追加写入到passwd.list文件中
[laoma@centos7 ~]$ find /etc -name 'passwd' 1>>passwd.list
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/grub.d’: 权限不够
......
[laoma@centos7 ~]$ cat passwd.list
/etc/pam.d/passwd
/etc/passwd
/etc/pam.d/passwd
/etc/passwd
# 将错误信息覆盖写入到passwd.err文件中
[laoma@centos7 ~]$ find /etc -name 'passwd' 2>passwd.err
/etc/pam.d/passwd
/etc/passwd
[laoma@centos7 ~]$ cat passwd.err
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/grub.d’: 权限不够
......
# 将错误信息扔掉
[laoma@centos7 ~]$ find /etc -name 'passwd' 2>/dev/null
/etc/pam.d/passwd
/etc/passwd
# 将错误信息追加写入到passwd.err文件中
[laoma@centos7 ~]$ find /etc -name 'passwd' 2>>passwd.err
/etc/pam.d/passwd
/etc/passwd
[laoma@centos7 ~]$ cat passwd.err
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/grub.d’: 权限不够
......
# 将错误信息、正确信息 覆盖 写入到不同文件
[laoma@centos7 ~]$ find /etc -name 'passwd' >passwd.list 2>passwd.err
# 将错误信息、正确信息 追加 写入到不同文件
[laoma@centos7 ~]$ find /etc -name 'passwd' >>passwd.list 2>>passwd.err
# 用于清空文件内容,也可用于创建一个空文件testfile
[laoma@centos7 ~]$ > testfile
[laoma@centos7 ~]$ >> testfile

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

# 同时将错误信息、正确信息 覆盖 写入到相同文件
[laoma@centos7 ~]$ find /etc -name 'passwd' &> passwd.all
# 同时将错误信息、正确信息 追加 写入到相同文件
[laoma@centos7 ~]$ find /etc -name 'passwd' &>> passwd.all

标准输出重定向到程序

管道符(|)实现,将上一个命令的输出作为标准输入传递给下一个命令。

# 示例1 查看哪个man page 可以resize ext4文件系统大小
# 搜索所有ext4相关手册,并保存到ext4.man文件中
[laoma@centos7 ~]$ man -k ext4 > ext4.man
# 过滤ext4.man文件中含有resize的行
[laoma@centos7 ~]$ grep resizer ext4.man
# 以上两个命令和合并为一行
[laoma@centos7 ~]$ man -k ext4 | grep resizer
resize2fs (8) - ext2/ext3/ext4 file system resizer

**注意:**管道符号后的命令必须能够接收标准输入,例如 ls 接收管道传递过来的标准输入。

tee命令

tee 命令作用,接收管道传递过来的stdin,并继续作为stdout输出。

[laoma@centos7 ~]$ > passwd.list
[laoma@centos7 ~]$ cat passwd.list
# tee命令覆盖保存到文件
[laoma@centos7 ~]$ find /etc -name 'passwd' 2>/dev/null | tee
passwd.list
/etc/pam.d/passwd
/etc/passwd
[laoma@centos7 ~]$ cat passwd.list
/etc/pam.d/passwd
/etc/passwd
# tee命令追加保存到文件
[laoma@centos7 ~]$ find /etc -name 'passwd' 2>/dev/null |tee -a
passwd.list
/etc/pam.d/passwd
/etc/passwd
[laoma@centos7 ~]$ cat passwd.list
/etc/pam.d/passwd
/etc/passwd
/etc/pam.d/passwd
/etc/passwd
# tee的标准输出继续通过管道传递下去
[laoma@centos7 ~]$ man -k passwd | tee passwd.man | grep passwd

标准输入重定向给程序

# 常规查看文件
[laoma@centos7 ~]$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4
localhost4.localdomain4
::1 localhost localhost.localdomain localhost6
localhost6.localdomain6
# cat 命令标准输入数据
[laoma@centos7 ~]$ cat < /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4
localhost4.localdomain4
::1 localhost localhost.localdomain localhost6
localhost6.localdomain
[laoma@centos7 ~]$ cat
hello # 键盘输入hello后回车
hello # 屏幕上显示hello
ctrl+d # 输入完成,退出
# shell读取到EOF时候,代表标准输入完成
[student@servera ~]$ cat << EOF
> hello
> world
> EOF
hello
world
[laoma@centos7 ~]$ cat <<< 'hello world'
hello world

判定一个命令是否接收标准输入:最简单的方式就是将文件内容作为标准输入重定向给程序。

**思考:**如何一次性将多行内容写入到文件中?

# 方法1:使用引号
[laoma@centos7 ~]$ echo 'hello world
> hello python
> hello linux' > multi_lines.txt
[laoma@centos7 ~]$ cat multi_lines.txt
hello world
hello python
hello linux
# 方法2:使用cat重定向
[laoma@centos7 ~]$ cat > multi_lines.txt << EOF
> hello world
> hello python
> hello linux
> EOF
[laoma@centos7 ~]$ cat multi_lines.txt
hello world
hello python
hello linux

Shell基础

变量定义和查看

变量用于保存字符串值,便于后续引用,变量值存储在当前会话内存中。

变量名只能包含:

  • 字母

  • 数字

  • 下划线

注意: 变量名不能以数字开头。

shell中变量的类型,一般不需要明确指明。

# 变量定义
[laoma@@centos7 ~]$ var1=key1
# 标准格式如下
[laoma@@centos7 ~]$ declare var1=key1
# 使用$引用变量值
[laoma@@centos7 ~]$ echo $var1
key1
# 示例2
[laoma@@centos7 ~]$ first_name=facai
[laoma@@centos7 ~]$ last_name=zhang
[laoma@@centos7 ~]$ echo $last_name $first_name
zhang facai
# 使用多个空格,效果一样
[laoma@@centos7 ~]$ echo $last_name $first_name
zhang facai
# 使用引号保留多个空格
[laoma@@centos7 ~]$ echo "$first_name $last_name"
zhang facai
[laoma@@centos7 ~]$ echo $last_name-$first_name
zhang-facai
[laoma@@centos7 ~]$ echo $last_name_$first_name
facai
# 使用{}限定变量范围
[laoma@@centos7 ~]$ echo ${last_name}_$first_name
zhang_facai
# 当前shell中有多少个变量
[laoma@@centos7 ~]$ set
# set命令还会显示函数
[laoma@@centos7 ~]$ set | grep first_name
first_name=facai
# 取消变量定义
[laoma@@centos7 ~]$ unset first_name
[laoma@@centos7 ~]$ echo $first_name
# 定义变量时候,转换变量大小写
[laoma@@centos7 ~]$ declare -l name=James
[laoma@@centos7 ~]$ echo $name
james
[laoma@@centos7 ~]$ declare -u name=James
[laoma@@centos7 ~]$ echo $name
JAMES

变量范围

  • 局部变量,只在当前shell中生效。

  • 全局变量,在当前shell以及shell子程序都生效。

[laoma@@centos7 ~]$ username=tom
[laoma@@centos7 ~]$ echo $username
tom
[laoma@@centos7 ~]$ bash
[laoma@@centos7 ~]$ echo $username
[laoma@@centos7 ~]$ export username=tom
# 或者
[laoma@@centos7 ~]$ username=tom;export username
[laoma@@centos7 ~]$ echo $username
[laoma@@centos7 ~]$ bash
[laoma@@centos7 ~]$ echo $username
tom

环境变量

根据变量是否是用户定义:

  • shell 环境内置变量:设置shell的运行环境。

  • 用户自定义变量:字面意思,用户自己定义的变量,也就是普通变量。

部分shell环境变量如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

LANG

[root@@centos7 ~]# date
202211月 07日 星期一 13:38:31 CST
[root@@centos7 ~]# export LANG=en_US.utf8
[root@@centos7 ~]# date
Mon Nov 7 13:38:55 CST 2022
[root@@centos7 ~]# export LANG=zh_CN.utf8
[root@@centos7 ~]# date
202211月 07日 星期一 13:40:49 CST

PATH

[root@@centos7 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@@centos7 ~]# mv /usr/bin/ls .
[root@@centos7 ~]# ls
bash: ls: command not found...
Similar command is: 'lz'
[root@@centos7 ~]# which ls
alias ls='ls --color=auto'
Similar command is: 'lz'
# 设置为原来的值
[root@@centos7 ~]#
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# 将/root目录追加到PATH中
[root@@centos7 ~]# export PATH=$PATH:/root
[root@@centos7 ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg ls
[root@@centos7 ~]# which ls
alias ls='ls --color=auto'
/root/ls
# ls移动到原来为止
[root@@centos7 ~]# mv ./ls /usr/bin

PS1

[laoma@@centos7 ~]$ echo $PS1
[\u@\h \W]\$
man bash 搜索PROMPTING
# 扩展说明:
\h 主机名,第一个 `.' 之前的部分
\H 主机名
\n 新行符
\t 当前时间,采用 24小时制的 HH:MM:SS 格式
\T 当前时间,采用 12小时制的 HH:MM:SS 格式
\@ 当前时间,采用 12小时制上午/下午 (am/pm) 格式
\A 当前时间,采用 24小时制上午/下午格式
\u 当前用户的用户名 the username of the current user
\w 当前工作目录
\W 当前工作目录的基本部分
\$ 如果有效 UID 是 0,就是 #, 其他情况下是 $
# 提示符变为了'HELLO '
[laoma@@centos7 ~]$ PS1='HELLO '
HELLO echo hello world
hello world
# 提示符带时间
[laoma@@centos7 ~]$ PS1='[\u@\h \W \t]\$ '
[laoma@@centos7 ~ 13:52:08]$
# 显示完整工作目录
[laoma@@centos7 ~ 13:52:08]$ PS1='[\u@\h \w \t]\$ '
[laoma@@centos7 ~ 13:52:56]$ cd /usr/share/doc
[laoma@@centos7 /usr/share/doc 13:53:04]$

彩色提示符

# 代码:
# \[\e[0;30m\]:黑色
# \[\e[0;31m\]:红色
# \[\e[0;32m\]:绿色
# \[\e[0;33m\]:黄色
# \[\e[0;34m\]:蓝色
# \[\e[0;35m\]:紫色
# \[\e[0;36m\]:青色
# \[\e[0;37m\]:白色
# \[\e[0m\]:恢复默认颜色

示例:

# vim /etc/bashrc 文件末尾添加一行
PS1='[\[\e[91m\]\u\[\e[0m\]\[\e[93m\]@\[\e[0m\]\[\e[92;1m\]\h\[\e[0m\]\
[\e[94m\] \W\[\e[0m\] \[\e[35m\]\t\[\e[0m\]]\[\e[93m\]\$\[\e[0m\] '
# 或者 echo 追加
echo "PS1='[\[\e[91m\]\u\[\e[0m\]\[\e[93m\]@\[\e[0m\]\[\e[92;1m\]\h\
[\e[0m\]\[\e[94m\] \W\[\e[0m\] \[\e[35m\]\t\[\e[0m\]]\[\e[93m\]\\\$\
[\e[0m\] '" >> /etc/bashrc
# 注意 echo追加的PS1与直接vim的是不一致的,体现在\\\$。

HISTTIMEFORMAT

控制历史命令时间格式。通过设置该变量,可以在执行 history 命令时显示每条历史命令的执行时间。

常用配置示例

  1. 显示年月日时分秒(如 2024-10-24 15:30:45 ):
export HISTTIMEFORMAT="%F %T "

效果: history 输出会类似 1000 2024-10-24 15:30:45 ls -l

  1. 显示更简洁的时间格式(如 10-24 15:30 ):
export HISTTIMEFORMAT="%m-%d %H:%M "

HISTTIMEFORMAT 支持的常见时间格式符:

  • %F :完整日期(年 - 月 - 日,如 2024-10-24 )

  • %T :完整时间(时:分: 秒,如 15:30:45 )

  • %Y :四位年份(如 2024 )

  • %m :两位月份(01-12)

  • %d :两位日期(01-31)

  • %H :24 小时制小时(00-23)

  • %M :分钟(00-59)

注意 echo追加的PS1与直接vim的是不一致的,体现在\$。


**HISTTIMEFORMAT**

控制历史命令时间格式。通过设置该变量,可以在执行 history 命令时显示每条历史命令的执行时间。

常用配置示例

1. **显示年月日时分秒**(如 2024-10-24 15:30:45 ):

```bash
export HISTTIMEFORMAT="%F %T "

效果: history 输出会类似 1000 2024-10-24 15:30:45 ls -l

  1. 显示更简洁的时间格式(如 10-24 15:30 ):
export HISTTIMEFORMAT="%m-%d %H:%M "

HISTTIMEFORMAT 支持的常见时间格式符:

  • %F :完整日期(年 - 月 - 日,如 2024-10-24 )

  • %T :完整时间(时:分: 秒,如 15:30:45 )

  • %Y :四位年份(如 2024 )

  • %m :两位月份(01-12)

  • %d :两位日期(01-31)

  • %H :24 小时制小时(00-23)

  • %M :分钟(00-59)

  • %S :秒(00-59)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐