Linux 学习笔记
1.认识Linux shell
1.什么是Linux?
Linux内核
GNU工具(GNU's Not Unix的缩写)
图形化桌面环境
-
应用软件
1.1 Linux内核功能
1.系统内存管理 ---内存---虚拟内存---交换空间(swap space)---页面(page)---换出(swapping out)
2.软件程序管理 ---进程---第一个进程init进程-----开机启动进程表---/etc/inittab或 /etc/init.d
---/etc/rcX.d---
Linux操作系统有5个启动运行级
运行级为1,单用户模式(系统管理员)才能登录进行紧急的文件系统维护
运行级为3,标准启动--大多数应用软件比如网路支持程序
运行级为5,启动图形化X Windows系统
3.硬件设备管理 ---驱动程序代码 a. 编译进内核的设备驱动代码 b. 可插入内核的设备驱动模块
Linux系统将硬件设备当成特殊的文件,称为设备文件:
字符型设备文件 ---处理数据时每次只能处理一个字符的设备,如大多数的调制解调器和终端
块设备文件 ---处理数据时每次能处理大块数据的设备,如硬盘
-
网络设备文件 ---采用数据包发送和接受数据的设备,包括各种网卡和一个特殊的回环设备
Linux为系统上的每个设备创建一种称为节点的特殊文件,与设备的所有通信都通过设备节点完成。
4.文件系统管理 ---文件系统(Virtual File System,VFS)作为每个文件系统交互的接口。
Linux文件系统:
1.2 GNU 工具
内核控制硬件设备,GNU工具来执行一些标准功能,比如控制文件和程序。
1.核心GNU工具(GNU coreutils软件包--core utilities)
a. 用来处理文件的工具
b. 用来操作文本的工具
c. 用来管理进程的工具
2\. shell 为用户提供启动程序、管理文件系统的文件以及运行在Linux上的进程的途径。bash shell
2.走进shell
命令行界面(command line interface, CLI)
1.启动shell
GNU bash shell能提供对Linux系统的交互式访问。它是作为普通程序运行的,通常是在用户登录终端时启动。登录时系统启动的设立了依赖于用户账户的配置。/etc/passwd
2.bash 手册
man 命令用来访问存储在Linux系统上的手册页面
man man 可查看与手册页相关的手册页
man -k 关键字 关键字查找命令
-help 或 --help
2.基本的bash shell命令
1.文件和目录列表
1.1 基本列表功能
ls 命令显示当前目录下的文件和目录(按字母排序)
ls -F 区分文件和目录
ls -a 显示包括隐藏文件在内的所有文件
ls -F -R 列出当前目录下包含的子目录中的文件
ls -l 显示长列表
ls -l file 过滤输出,单个输出 file 文件
1.2 创建文件
touch test 创建一个空文件 或 改变文件的修改时间
touch -a test 修改文件的访问时间 ls -l --time=atime test 显示文件test的访问时间
1.3 复制文件
cp source(源对象) destination(目标对象) 当两者都为文件时,将源文件复制成一个新文件
cp test01 test02
cp -i test01 Document/ 新文件与源文件名相同
cp -R 递归复制整个目录
cp -R Scripts/ Sub_Scripts 在执行cp -R 命令之前,目录Sub_Scripts时随着命令被创建的
cp *script Sub_Scripts/ 将所有以script结尾的文件复制到Sub_Scripts目录中
1.4 链接文件
Linux中有两种不同类型的文件链接:
-
符号链接:是一个实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。这两个通过符号链接在一起的文件,彼此的内容并不相同。需要加参数-s
ln -s data_file sl_data_file
-
硬链接:会创建独立的虚拟文件,其中包含了原始文件的信息及位置,根本上时同一个文件,不要加入参数
ln code_file hi_code_file ls -i *data_file 命令显示 *data_file文件的inode编号
注:只能对处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,只能使用符号链接。
1.5 重命名文件
mv fall fzll 将fall文件更改为fzll,但indoe编号和时间戳保持不变
mv fzll Pictures/ 将fzll文件移动到Pictures目录中,indoe编号与时间戳保持不变
mv Scripts new_Scripts 将目录Scripts整个目录及内容移到new_Scripts目录中
1.6 删除文件
rm -i fall 删除文件fall
rm -f file/directory 删除多个文件或目录时,用-f参数
2.处理目录
2.1 创建目录
mkdir New_Dir 创建名为New_Dir的新目录
mkdir -p New_Dir/Sub_Dir/Under_Dir 创建多个目录和子目录
2.2 删除目录
rmdir New_Dir rmdir命令只能删除空目录
rm -ri My_Dir 删除文件,再删除目录本身
3.查看文件内容
3.1 查看文件类型
file my_file 查看文件类型
3.2 查看整个文件
1.cat命令
cat test1 查看文件文本内容
-n 参数给所有行加上行号
-b 只给有文本的行加上行号
-T 会用^I字符组合去替换文中的所有制表符
缺陷:一旦运行,就无法控制后面的操作
2.more命令
more /home/clivia/test #显示文本文件内容,但会在显示每页数据之后停下来
more是分页工具,通过空格键或回车键 逐行向前的方式浏览文本文件。按q见退出
3.less命令
less test1 #能够识别上下键以及上下翻页键
3.3 查看部分文件
查看文件开头或结尾,比如日志文件
-
tail命令
tail log_file 默认查看文件末尾10行 tail -n 3 log_file 显示文件最后3行 -f 参数允许在其他进程使用该文件时查看文件的内容,tail命令会保持活动状态,并不断显示添加到文件中的内容。这是实时监测系统日志的绝妙方式。
-
head命令
head log_file 默认显示文件开头10行 -n 参数显示开头n行
4. 更多的bash shell命令
4.1 探查进程
$ ps
PID TTY TIME CMD
3081 pts/0 00:00:00 bash
3029 pts/0 00:00:00 ps
$
默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户的进程。
上述命令显示了进程的进程ID(Process ID,PID)、运行的终端(TTY)、进程已用的CPU时间。
Linux系统中使用的GNU ps命令支持3中不同类型的命令行参数:
-
Unix风格的参数,前面加单破折线:
UID:启动这些进程的用户 PID:进程的进程ID PPID:父进程的进程号(如果该进程是由另一个进程启动的) C:进程生命周期中的CPU利用率 STIME:进程启动时的系统时间 TTY:进程启动时的终端设备 TIME:运行进程需要的累计CPU时间 CMD:启动的程序名称 F:内核分配给进程的系统标记 S:进程的状态(O代表正在运行;S代表在休眠;R代表可运行,正等待运行;Z代表僵化,进程已结束但父进程已不存在;T代表停止) PRI:进程的优先级(越大的数字代表越低的优先级) NI:谦让度值用来参与决定优先级 ADDR:进程内存地址 SZ:加入进程被换出,所需交换空间的大致大小 WCHAN:进程休眠的内核函数的地址
-
BSD风格的参数,前面不加破折线:
VSZ:进程在内存中的大小,以千字节(KB)为单位 RSS:进程在未换出时占用的物理内存 STAT:代表当前进程状态的双字符状态码 <:该进程运行在高优先级上 N:该进程运行在低优先级上 L:该进程由页面锁定在内存中 s:该进程是控制进程 l:该进程是多线程的 +:该进程运行在前台
-
GNU风格的长参数,前面加双破折线:
--forest 显示进程的层级信息,并用ASCII字符绘出图标
可以将GNU长参数和Unix或BSD风格参数混用来定制输出
ps命令缺点:只能显示某个特定时间点的信息
top命令能够实时显示进程信息。
进程的详细列表:
PID:进程的ID
USER:进程属主的名字
PR:进程的优先级
NI:进程的谦让度值
VIRT:进程占用的虚拟内存总量
RES:进程占用的物理内存总量
SHR:进程和其他进程共享的内存总量
S:进程的状态(D代表可中断的休眠状态,R代表在运行状态,S代表休眠状态,T代表跟踪状态或停止状态,Z代表僵化状态)
%CPU:进程使用的CPU时间比例
%MEN:进程使用的内存占可用内存的比例
TIME+:自进程启动到目前为止的CPU时间总量
COMMAND:进程所对应的命令行名称,也就是启动的程序名
kill 3940 kill发送的是TERM信号,必须使用PID,而且你必须是进程的属主或登陆root用户
kill -s HUP 3940 强行终止,-s参数支持指定信号(用信号名或信号值)
kill -9 3940 强制无条件终止进程3940
killall http* 支持通过进程名来结束进程,此命令是结束所有以http开头的进程
4.2监测磁盘空间
-
挂载存储媒体
1.1 mount 命令(需要root权限)
默认情况下,mount命令会输出当前系统上挂载的设备列表
mount命令提供如下4部分信息: 1.媒体的设备文件名 2.媒体挂载到虚拟目录的挂载点 3.文件系统类型 4.已挂载媒体的访问状态
mount -t vfat /dev/sdb1 /media/disk #指定为vfat格式的文件系统挂载 参数-t
参数 描述 -a 挂载/etc/fstab文件中指定的所有文件系统 -f 使mount命令模拟挂载设备,但并不真的挂载 -F 和-a参数一起使用时,会同时挂载所有文件系统 -v 详细模式,将会说明挂载设备的每一步 -I 不启用任何/sbin/mount.filesystem下的文件系统帮助文件 -l 给ext2、ext3或XFS文件系统自动添加文件系统标签 -n 挂载设备,但不注册到/etc/mtab已挂载设备文件中 -p num 进行加密挂载时,从问价描述num中获得密码短语 -s 忽略该文件系统不支持的挂载选项 -r 将设备挂载为只读的 -w 将设备挂载为可读写的(默认参数) -L label 将设备按指定的label挂载 -U uuid 将设备按指定的uuid挂载 -O 和-a参数一起使用,显示命令只作用到特定的一组文件系统上 -o 给文件系统添加特定的选项 -o参数允许在挂载文件系统时添加一些以逗号分隔的额外选项。一下为常用选项:
ro:以只读形式挂载 rw:以读写形式挂载 user:允许普通用户挂载文件系统 check=none:挂载文件系统时不进行完整性校验 loop:挂载一个文件
2.umount命令
umount [directory | device ] #卸载设备
-
df 命令 查看磁盘空间
df -h
-
du命令
du命令可以显示某个特定目录(默认当前目录)的磁盘使用情况
du命令参数:
-c:显示所有已列出文件总的大小 -h:按用户易读的格式输出大小,即用K替代千字节,用M替代兆字节,用G替代吉字节 -s:显示每个输出参数的总计
4.3 处理数据文件
-
排序数据 sort命令
sort file1 #排序file1文件,按默认语言排序 sort -n file2 #按数字的值排序file2 sort -M file3 #按月排序file3
sort命令参数:
单破折线 双破折线 描述 -b --ignore-leading-blanks 排序时忽略起始空白 -C --check=quiet 不排序,如果数据无需也不要报告 -c --check 不排序,但检查输入数据是u是已排序;未排序的话,报告 -d --dictionary-order 仅考虑空白和字母,不考虑特殊字符 -f --ignore-case 默认情况下,会将大写字母排在前面;这个参数会忽略大小写 -g --general-number-sort 按通用数值来排序(跟-n不同,把值当浮点数来排序,支持科学计数法表示的值) -i --ignore-nonprinting 在排序时忽略不可打印字符 -k --key=POS1[,POS2] 排序从POS1位置开始;如果制定了POS2的话,到POS2位置结束 -M --month-sort 用三字符月份名按月份排序 -m --merge 将连个已排序数据文件合并 -n --numeric-sort 按字符串数值来排序(并不转换浮点数) -o --output=file 将排序结果写出到指定的文件中 -R --random-sort 按随机生成的散列表的键值排序 --random-source=FILE 指定-R参数用到的随机字节的源文件 -r --reverse 反序排序(升序变成降序) -S --buffer-size=SIZE 指定使用的内存大小 -s --stable 禁用最后重排序比较 -T --temporay-directory=DIR 指定一个位置来存储临时工作文件 -t --field-separatory=SEP 指定一个用来区分键位置的字符 -u --unique 和-c参数一起使用时,检查严格排序;不和-c参数一起使用时,仅输出第一例相似的两行 -z --zero-terminated 用NULL字符作为行尾,而不是用换行符 du -sh * | sort -nr #降序输出磁盘使用情况
-
搜索数据
grep [options] pattern [file] grep命令行格式,输出的是包含了匹配模式的结果 例如: $ grep three file1 three $ grep t file1 two three $
参数 -v:输出不匹配该模式的行 -n:显示匹配模式的行所在的行号 -c:知道有多少行含有匹配的模式 -e:指定多个匹配模式,比如 grep -e t -e f file1 输出含有字符t或字符f的所有行 grep支持Unix风格正则表达式 比如: grep [tf] file1
egrep 支持POSIX扩展正则表达式
fgrep支持将匹配莫斯指定为用换行符分割的一列固定长度的字符串
-
压缩解压数据
Linux文件压缩工具
工具 | 文件扩展名 | 描述 |
---|---|---|
bzip2 | .bz2 | 采用Burrows-Wheeler块排序文本压缩算法和霍夫曼编码 |
compress | .Z | 最初的Unix文件压缩工具 |
gzip | .gz | GNU压缩工具,用Lempel-Ziv编码 |
zip | .zip | Windows上PKZIP工具的Unix实现 |
tar(打包工具) | .tar | tar程序打包的文件,文件大小没有改变 |
.tar.gz或.tgz | tar程序打包的文件,其中经过gzip压缩 | |
.tar.bz2 | tar程序打包的文件,其中经过bzip2压缩 |
1、tar命令
打包:tar czvf FileName.tar DirName
解包:tar zxvf FileName.tar
2、.tar.gz
压缩:tar -zcvf test.tar.gz test
解压:tar -zxvf test.tar.gz
3、.tar.bz2
压缩:tar jcvf test.tar.bz2 test
解压:tar jxvf test.tar.bz2
4、gz命令
压缩:gzip FileName
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
5、bz2命令
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
6、Z命令
解压:uncompress FileName.Z
压缩:compress FileName
7、.tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName
8、zip命令
解压:unzip FileName.zip
压缩:zip -r FileName.zip DirName
9、xz命令
Linux电脑中需要安装xz的工具,xz工具把tar.xz解压成tar,然后在用tar工具解压文件
解压:xz -d temp.tar.xz
tar -xvf temp.tar
压缩:tar -cvf file.tar file
xz -z file.tar
5.理解shell
5.1shell类型
CentOS发行版默认系统shell为 bash shell
注意:在有些发行版上,默认的系统shell和默认的交互shell并不相同,例如 Ubuntu, 交互shell为 bash shell,系统默认shell 为 dash shell。
cat /etc/passwd 查看交互shell
ls -l /bin/shell 查看系统shell
5.2 shell的父子关系
在CLI中输入bash就会生成一个子shell,输入exit退出
命令列表:在命令之间加入分号即可
进程列表:必须加括号
(pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls)
echo $BASH_SUBSHELL #命令,返回表示没有子shell,如果返回1或者更大的数字,表明存在子shell
子shell的用法:
- 后台模式
在后台模式中运行命令可以处理命令的同时让出CLI,以供他用。
sleep 10 进程等待10秒,会话暂停10秒中,然后返回shell CLI提示符
要将命令置入后台模式,可以在命令末尾加上字符&
除了ps命令外,jobs命令可以显示出当前运行在后台模式模式中的所有用户的进程(作业)
-
将进程列表置入后台
(tar -cf test.tar /home/test ; tar -cf my.tar /home/clivia)&
-
协程
协程可以同时做两件事,它在后台生成一个子shell,并在这个shell中执行命令。要进行协程处理,得使用coproc命令,还有要在子shell中执行的命令。
$ coproc sleep 10 [1] 2544 $ jobs [1]+ Running coproc COPROC sleep 10 & COPROC是 coproc命令给进程起的名字 可以使用命令的扩展语法自己设置这个名字 $ coproc my_job { sleep 10; } [1] 2570 $ $ jobs [1]+ Running coproc my_job {sleep 10; } &
5.3 理解shell 的内建命令
-
外部命令(外部命令)
外部命令也被称为文件系统命令,是存在于bash shell之外的程序。它不是shell程序的一部分。外部命令程序通常位于/bin、/usr/bin、/sbin、或/usr/sbin中。
例如:ps就是一个外部命令 $ which ps /bin/ps $ $ type -a ps ps is /bin/ps $
注意;当外部命令执行时,会创建一个子进程。这种操作被称为衍生(forking)。 例如:ps命令 $ ps -f UID PID PPID C STIME TTY TIME CMD clivia 2741 2742 0 18:30 pts/9 00:00:00 -bash clivia 2801 2743 0 18:39 pts/9 00:00:00 ps -f $
-
内建命令
内建命令与外建命令区别是前者不需要使用子进程来执行,是shell工具的组成部分,不需要借助外部程序文件来执行。
cd 和 exit 命令都内建于bash shell。可以用type命令来了解某个命令是否是内建的。
例如: $ type cd cd is a shell builtin $ $ type exit exit is a shell builtin $
也有命令如echo和pwd既是内建命令也有外部命令
例如: $ type -a echo echo is a shell builtin echo is /bin/echo $ $ which echo /bin/echo $ 注:which命令只显示出外部命令文件
history 命令内建命令,查看最近用过的命令表
alias 命令别名 alias li='ls -li'
3.Linux环境变量
bash shell 中,环境变量分为两类:
全局变量
局部变量
1.环境变量
1.1全局环境变量
查看全局变量,可以使用env或printenv命令,但显示个别环境变量的值,可以使用printenv,不能使用env命令,可以使用echo命令,需在变量前加一个美元符($)
$ printenv HOME
/home/clivia
$
$ env HOME
env: HOME: No such file or directory
$
$ echo $HOME
$ /home/clivia
$
1.2局部环境变量
Linux系统并没有一个只显示局部环境变量的命令。
set命令会显示某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量。
env、printenv、set命令的区别:
set命令会显示出全局变量、局部变量以及用户定义变量,还会按照字母顺序对结果进行排序;env、printenv不会对变量排序,也不会输出局部变量和用户定义变量
2.设置用户定义变量
-
设置局部用户定义变量
可以通过等号给环境变量赋值,值可以是数值或字符串 $ echo $my_script $ my_script=Hello $ $ echo $my_script Hello Notice: 如果要给变量赋一个好友空格的字符串值,必须单引号来界定字符的首和尾 ****所有的环境变量均使用大写字母,这是bash shell的标准惯例。如果是你自己船舰的局部变量或是shell脚本,使用小写字母*** 重要: 变量名、等号和值之间没有空格。
-
设置全局环境变量
在设定全局环境变量的进程所创建的子进程中,该变量都是可见的。创建全局环境变量的方法是先创建一个局部环境变量,然后再把它到处到全局环境中。
这个过程通过export命令来完成,变量名前面不需要加$.
$ my_variable="I love linux" $ $ export my_variable $ $ echo $my_variable I love linux $ $ bash $ $ echo $my_variable I love linux $ $ exit exit $ $ echo $my_variable I love linux $ Notice: 修改子shell中全局环境变量并不会影响到父shell中该变量的值
3.删除环境变量
使用unset命令删除已经存在的环境变量,不需要使用$符号
Notice:
如果要用到变量,使用$;如果要操作变量,不使用$。一个例外,使用printenv显示某个变量的值。
4.设置 PATH 环境变量
PATH环境变量定义了用于进行命令和程序查找的目录。
$ PATH=$PATH:/home/clivia/scripts
$
$ echo $PATH
/usr/local/sbin;/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/usr/games:/usr/local/games:/home/clivia/scripts
$
对PATH变量的修改只能持续到退出或重启系统。这种效果不能持续。
5.定位系统环境变量
让环境变量持久化。在登录Linux系统启动一个bash shell 时,默认情况下bash会在几个文件中查找命令。这些文件叫做启动文件或环境文件。bash检查的启动文件取决于启动bash shell的方式。
启动bash shell 有三种方式;
- 登录时作为默认登录shell
- 作为非登录shell的交互式shell
- 作为运行脚本的非交互shell
5.1 登录shell
登录shell会从5个不同的启动文件里读取命令:
/etc/profile 系统上默认的bash shell的主启动文件。每个用户登录时都会执行这个文件。
$HOME/.bash_profile
$HOME/.bashrc
$HOME/.bash_login
$HOME/.profile
位于用户的HOME目录下,每个用户都可以编辑这些文件并添加自己的环境变量,这些环境变量会在每次启动bash shell会话时生效。
5.2 交互式 shell 进程
不是登录系统时启动的shell,比如在CLI输入bash命令启动的shell,称之为交互式shell
交互式shell不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc 文件
.bashrc文件有两个作用:
1、查看/etc目录下的bashrc文件
2、为用户提供一个定制自己命名别名和私有脚本函数的地方
5.3 非交互式shell
系统执行shell脚本时用的shell,称为非交互式shell。但是当你在系统上运行脚本时,也希望能够运行一些特定启动的命令。bash shell 提供了BASH_ENV环境变量。
当shell启动一个非交互式shell进程时,它会检查这个环境变量来查看要执行的启动文件,如果有指定文件,shell会执行该文件里的命令,这通常包括shell脚本变量设置。
5.4 环境变量持久化
在/etc/profile.d目录中创建一个以.sh结尾的文件。把所有新的或修改过的全局环境变量设置放在这个文件中。
大多数发行版中,存储个人用户永久性bash shell变量的地方是$HOME/.bashrc文件
6. 数组变量
环境变量可以作为数组使用,可以存储多个值的变量。
要给某个环境变量设置多个值,可以把值放在括号里,值与值之间用空格分隔。
$ mytest=(one two three four five)
$
$ echo $mytest # 只会显示第一个值
one
$ echo ${mytest[2]} # 显示第三个值
three
$
$ echo ${mytest[*] # 显示所有值
one two three four five
$
$ mytest[2]=six #改变某个索引值位置的值
$
$ echo ${mytest[2]}
six
$
$ unset mytest[2] #删除数组中某个值
$
4.理解Linux文件权限
4.1Linux的安全性
Linux安全系统的核心时用户账户,用户权限是通过创建用户时分配的用户ID来跟踪的。UID是数值,每个用户都有唯一的UID,但在登录系统时用的不是UID,而是登录名。
4.1.1 /etc/passwd文件
/etc/passwd文件记录了一些用户有关的信息
root用户账户是Linux的系统管理员,固定分配给它的UID是0.
/etc/passwd 文件的字段包含了如下信息:
登录用户名
用户密码
用户账户的UID(数字形式)
用户账户的组ID(GID)(数字形式)
用户账户的文本描述(称为备注字段)
用户HOME目录的位置
用户默认shell
Notice:
密码存储在/etc/passwd文件有安全隐患,现在绝大多数Linux系统将用户密码保存在另一个单独的文件(shadow文件,/etc/shadow),只有特定的程序(比如登录程序)才能访问这个文件。
4.1.2 /etc/shadow 文件
/etc/shadow文件只有root用户才能访问
/etc/shadow文件每条记录都有9个字段
与/etc/shadow文件中的登录名字段对应的登录名
加密后的密码
自上次修改密码后过去的天数密码(自1970年1月1日开始计算)
多少天后才能更改密码
多少天后必须更改密码
密码过期前提前多少天提醒用户更改密码
密码过期后多少天禁用用户账户
用户账户被禁用的日期(用自1970年1月1日到当天的天数表示)
预留字段给将来使用
Notice:
使用shadow密码系统后,Linux系统可以更好地控制用户密码。
4.1.3 添加新用户
useradd命令创建新用户,系统默认值被设置在/etc/default/useradd中,可以使用加 -D选项的useradd命令查看所用Linux系统中的默认值。
# /usr/sbin/useradd -D
GROUP=100 #新用户会被添加到GID为100的公共组
HOME=/home #新用户的HOME目录将会位于/home/loginname
INACTIVE=-1 #新用户账户密码在过期后不会被禁用
EXPIRE= #新用户账户未被设置过期日期
SHELL=/bin/bash #新用户账户将bash shell作为默认shell
SKEL=/etc/skel #系统会将/etc/skel目录下的内容复制到用户的HOME目录下
CREATE_MAIL_SPOOL=yes #系统为该用户账户在mail目录下创建一个用于接收邮件的文件
#
参数 | 描述 |
---|---|
-c comment | 给新用户添加备注 |
-d home_dir | 为主目录指定一个名字(如果不想用登录名作为主目录的话) |
-e expire_date | 用YYYY-MM-DD格式指定一个账户过期的日期 |
-f inactive_days | 指定这个账户密码过期后多少天这个账户被禁用;0表示密码一过期就立即禁用,-1表示禁用这个功能 |
-g initial_group | 指定用户登录组的GID或组名 |
-G goup ... | 指定用户除登录组之外所属的一个或多个附加组 |
-k | 必须和-m一起使用,将/etc/skell目录的内容复制到用户的HOME目录 |
-m | 创建用户的HOME目录 |
-M | 不创建用户的HOME目录(当默认设置里要求创建时才使用这个选项) |
-n | 创建一个与用户登录名同名的新组 |
-r | 创建系统账户 |
-p passwd | 为用户账户指定默认密码 |
-s shell | 指定默认的登录shell |
-u uid | 为账户指定唯一的UID |
表 useradd更改默认值的参数: useradd -D -参数
参数 | 描述 | |
---|---|---|
-b | default_home | 更改默认的创建用户HOME目录的位置 |
-e | expiration_date | 更改默认的新账户的过期日期 |
-f | inactive | 更改默认的新用户从密码过期到账户被禁用的天数 |
-g | group | 更改默认的组名称或GID |
-s | shell | 更改默认的登录shell |
# useradd -D -s /bin/tsch
# useradd -D
GROUP=100 #新用户会被添加到GID为100的公共组
HOME=/home #新用户的HOME目录将会位于/home/loginname
INACTIVE=-1 #新用户账户密码在过期后不会被禁用
EXPIRE= #新用户账户未被设置过期日期
SHELL=/bin/tsch #新用户账户将tsch shell作为默认shell
SKEL=/etc/skel #系统会将/etc/skel目录下的内容复制到用户的HOME目录下
CREATE_MAIL_SPOOL=yes #系统为该用户账户在mail目录下创建一个用于接收邮件的文件
#
4.1.4 删除用户
userdel命令只会删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件,加参数-r,会删除用户的HOME目录以及邮件目录。
例如:
# /usr/sbin/userdel -r test
# ls -al /home/test
ls: cannot access /home/test: No such file or diretory
#
4.1.5 修改用户
用户账户修改工具表;
命令 | 描述 |
---|---|
usermod | 修改用户账户的字段,还可以指定主要组以及附加组的所属关系 |
passwd | 修改已有用户的密码 |
chpasswd | 从文件中读取登录名密码对,并更新密码 |
chage | 修改密码的过期日期 |
chfn | 修改用户账户的备注信息 |
chsh | 修改用户账户的默认登录shell |
-
usermod
usermod能修改/etc/passwd文件中的大部分字段,根据参数修改需要修改的字段,参数同useradd。另外还有一些选项如下:
-l 修改用户账户的登录名 -L 锁定账户,使用户无法登录 -p 修改账户的密码 -U 解除锁定,使用户能够登录
-
passwd和chpasswd
passwd更改用户密码
# passwd test
如果需要系统中的大量用户修改密码,chpasswd命令可用,chpasswd命令能从标准输入自动读取登录名和密码对列表,给密码加密,然后为用户账户设置
-
chsh、chfn和chage
chsh命令用来快速修改默认的用户登录shell。使用时必须用shell的全路径名作为参数,不能只用shell名。
# chsh -s /bin/csh test Changing shell for test. Shell changed. #
chfn 命令提供了在/etc/passwd文件的备注字段中存储信息的标准方法,finger命令可以非常方便的查看Linux系统上的用户信息。
chage命令用来帮助管理用户账户的有效日期。
chage命令参数:
参数 描述 -d 设置上次修改密码到现在的天数 -E 设置密码过期的日期 -I 设置密码过期到锁定账户的天数 -m 设置修改密码之间最少要多少天 -W 设置密码过期前多久开始出现提醒信息
4.2 使用 Linux 组
组权限允许多个用户对系统中的对象(比如文件、目录或设备等)共享一组共用的权限。
4.2.1 /etc/group 文件
/etc/group 文件包含系统上用到的每个组的信息。
/etc/group文件共有4个字段:
组名
组密码
GID #系统账户用的组通常会分配低于500的GID值,用户组GID会从500开始分配
属于该组的用户列表
Notice:
千万不能通过直接修改/etc/group文件来添加用户到一个组,要用usermod命令。在添加用户到不同的组之前,要先创建组。
用户列表某种意义上有些误导人,在列表中,有些组并没有列出用户。这并不是说这些组没有成员。当一个用户在/etc/group文件中指定某个组作为默认组时,用户账户不会作为改组成员出现在/etc/group文件中。
4.2.2 创建新组
groupadd命令可创建新组,在创建新组时,默认没有用户被分配到改组,需要usermod -G 命令来补充
usermod -G 将该组添加到用户的属组列表里
usermod -g 指定的组名会替换掉该账户的默认组
4.2.3 修改组
groupmod -g(GID)或 -n(组名) 新组名 旧组名
/usr/sbin/groupmod -n sharing shared
修改组名时,GID和组成员不会变,只有组名改变,由于所有的安全权限都是基于GID的,可以随意更改组名而不会影响文件的安全性。
4.3 理解文件权限
4.3.1 使用文件权限符
-rwxrwxr-x 1 test test 4882 2020-03-04 16:34 mytest
文件mytest有下面3组权限:
rwx:文件的属主(设为登录名test)
rwx:文件的属组(设为组名test)
r-x:系统上其他人
4.3.2 默认文件权限
Linux文件权限码:
权限 | 二进制值 | 八进制值 | 描述 |
---|---|---|---|
--- | 000 | 0 | 没有任何权限 |
--x | 001 | 1 | 只有执行权限 |
-w- | 010 | 2 | 只有写入权限 |
-wx | 011 | 3 | 有写入和执行权限 |
r-- | 100 | 4 | 只有读取权限 |
r-x | 101 | 5 | 有读取和执行权限 |
rw- | 110 | 6 | 与读取和写入权限 |
rwx | 111 | 7 | 有全部权限 |
umask命令用来设置所创建文件和目录的默认权限,它只是一个掩码。它会屏蔽掉不想授予该安全级别的权限
文件一开始的权限是666,减去umask值022之后,就变成644了。
把umask值设成026后,默认文件权限就变成640了,文件就变成751了
4.4 改变安全设置
4.4.1 改变权限
chmod命令用来改变文件和目录的安全性设置,
格式: chmod options mode file
mode参数可以使用八进制模式或符号模式进行安全性设置。
例如:
$ chmod 760 newfile
$ ls -l newfile
-rwxrw---- 1 clivia clivia 0 Feb 29 16:30 newfile
$
使用符号模式更改文件或目录权限:
[ugoa...][+-=][rwxXstugo...]
* u 代表用户
* g 代表组
* o 代表其他
* a 代表上述所有
* + 代表增加权限
* - 代表移除权限
* = 将权限设置成后面的值
* X 如果对象是目录或者它已有执行权限,赋予执行权限
* s 运行时重新设置UID或GID
* t 保留文件或目录
* u 设置属主权限
* g 设置属组权限
* o 设置其他用户权限
例如:
$ chmod o+r newfile
$ chmod u-x newfile
4.4.2 改变所属关系
chown命令用来改变文件的属主,chgrp命令用来改变文件的默认属组。
chown命令格式如下:
chown options owner[.group] file
可用登录名或UID来指定文件的新属主。
# chown yang newfile 只改变属主
# chown yang.shared newfile 同时改变文件的属主和属组
# chown .yang newfile 只改变属组
如果Linux系统采用和用户登录名匹配的组名,可以只用一个条目就改变二者。
# chown test. newfile
Notice: 只有root用户能够改变文件的属主。任何属主都可以改变文件的属组,但前提是属主必须是原属组和目标属组的成员。
chgrp命令可以更改文件或目录的默认属组
$ chgrp shared newfile
$ ls -l newfile
-rw-rw-r-- 1 clivia shared 0 Feb 20 20:20 newfile
$
4.5 共享文件
Linux系统上共享文件的方法就是创建组
Linux为每个文件和目录存储了3个额外的信息位。
设置用户ID(SUID):当文件被用户使用时,程序会以文件属主的权限运行。
设置组ID(SGID):对文件来说,程序会以文件属组的权限运行;对目录来说,目录中创建的新文件会以目录的默认属组作为默认属组。
粘着位:进程结束后文件还驻留(粘着)在内存中。
要创建一个共享目录,使目录里的新文件都能沿用目录的属组,只需将改名一路的SGID位置位。
$ mkdir testdir #创建共享目录
$ ls -l
drwxrwxr-x 2 rich rich 4096 Feb 29 20:20 testdir/
$ chgrp shared testdir #改变testdir的默认属组为shared
$ chmod g+s testdir #将testdir目录的SGID位置位,保证目录中新建的文件都用shared作为默认组
$ ls -l
drwxrwxr-x 2 rich shared 4096 Feb 29 20:20 testdir/
$ umask 002 #使环境正常工作,所有组成员的umask值设置成文件对属组成员可写
$ cd testdir
$ touch testfile #在共享目录下创建文件,现在shared组的所有用户都能访问这个文件了
$ ls -l
total 0
-rw-rw-r-- 1 rich shared 0 Feb 29 20:21 testfile
$
5. 管理文件系统
5.1 探索Linux文件系统
5.1.1 基本的文件系统
- ext文件系统(扩展文件系统 extended filesystem, ext)
- ext2文件系统
5.1.2 日志文件系统
- ext3文件系统
- ext4文件系统
- Reiser文件系统
- JFS文件系统
- XFS文件系统
5.1.3 写时复制文件系统(copy-on-write,COW)
- ZFS文件系统
- Btrf文件系统
5.2 操作文件系统
5.2.1 创建分区
在存储设备上创建分区来容纳文件系统,可以用fdisk命令来实现,必须指定要分区的存储设备的设备名,另外好需要有超级用户权限
$ sudo fdisk /dev/sdb
...
...
Command (m for help):
如果是第一次给该存储设备分区,fdisk会警告你设备上没有分区表
fdisk交互式命令提示符hi用单字母命令来告诉fdisk做什么
fdisk命令表:
命令 | 描述 |
---|---|
a | 设置活动分区标志 |
b | 编辑BSD Unix系统用的磁盘标签 |
c | 设置DOS兼容标志 |
d | 删除分区 |
l | 显示可用的分区类型 |
m | 显示命令选项 |
n | 添加一个新分区 |
o | 创建DOS分区表 |
p | 显示当前分区表 |
q | 退出,不保存更改 |
s | 为Sun Unix系统创建一个新磁盘标签 |
t | 修改分区的系统ID |
u | 改变使用的存储单位 |
v | 验证分区表 |
w | 将分区表写入磁盘 |
x | 高级功能 |
5.2.2 创建文件系统
在将数据存储到分区之前,必须用某种文件系统对其进行格式化,这样Linux才能使用它。
创建文件系统的命令行程序:
工具 | 用途 |
---|---|
mkefs | 创建一个ext文件系统 |
mke2fs | 创建一个ext2文件系统 |
mkfs.ext3 | 创建一个ext3文件系统 |
mkfs.ext4 | 创建一个ext4文件系统 |
mkreiserfs | 创建一个ReiserFS文件系统 |
jfs_mkfs | 创建一个JFS文件系统 |
mkfs.xfs | 创建一个XFS文件系统 |
mkfs.zfs | 创建一个ZFS文件系统 |
mkfs.btrfs | 创建一个Btrfs文件系统 |
可用type命令查看文件系统工具是否安装
$ sudo mkfs.ext4 /dev/sdb1
创建文件系统后,下一步是将它挂载到虚拟目录下的某个挂载点,这样就可以将数据存储在新文件系统中了。
$ ls /mnt
$
$ sudo mkdir /mnt/my_partition
$
$ ls -al /mnt/my_partition
$
$ ls -dF /mnt/my_partition
/mnt/my_partition
$
$ sudo mount -t ext4 /dev/sdb1 /mnt/my_partition
$
$ ls -al /mnt/my_partition
total 24
drwxr-xr-x. 3 root root 4096 Jun 11 09:50 .
drwxr-xr-x. 3 root root 4096 Jun 11 09:55 ..
drwxr-----. 3 root root 16384 Jun 11 09:50 lost+found
$
Notice:这种挂载文件系统的方法只能临时挂载文件系统。当重启Linux系统时,文件系统并不会自动挂载。要强制Linux在启动时自动挂载新的文件系统,可以将其添加到/etc/fstab文件中。
5.2.3 文件系统的检查与修复
每个文件系统都有各自可以和文件系统交互的恢复命令。fsck命令能够检查和修复大部分类型的Linux文件系统,包括ext、ext2、ext3、ext4、ReiserFS、JFS和XFS。
该命令的格式是:
fsck options filesystem
options 可选设备名、在虚拟目录中的挂载点以及分配给文件系统的唯一UUID值
fsck命令行选项:
选项 | 描述 |
---|---|
-a | 如果检测到错误,自动修复文件系统 |
-A | 检查/etc/fstab文件中列出的所有文件系统 |
-c | 给支持进度条功能的文件系统显示一个进度条(只有ext2和ext3) |
-N | 不进行检查,只显示哪些检查会执行 |
-r | 出现错误时提示 |
-R | 使用-A选项时跳过根文件系统 |
-s | 检查多个文件系统时,依次进行检查 |
-t | 指定要检查的文件系统类型 |
-T | 启动时不显示头部信息 |
-v | 在检查时产生详细输出 |
-y | 检测到错误时自动修复文件系统 |
Notice:只能在为挂在的文件系统上运行fsck命令,对于大多数文件系统来说,只需卸载文件系统来检查,但根文件系统包含所欲核心的Linux命令和日志文件,所以无法卸载它,这时只需用LiveCD启动系统即可,然后再根文件系统上运行fsck命令。
5.3 逻辑卷管理
Linux逻辑卷管理器(logical volume manager,LVM)可以让你在无需重建整个文件系统的情况下,轻松地管理磁盘空间。
5.3.1 逻辑卷管理布局
逻辑卷的核心在于如何处理安装在系统上的硬盘分区。硬盘分区被称作物理卷(physical volume,PV)
多个物理卷集中在一起可以形成一个卷组(volume group,VG),逻辑卷管理系统将卷组视作一个物理硬盘。
整个结构中的最后一层是逻辑卷(logical volume,LV)。
5.3.2 Linux中的LVM
-
快照
在备份由于高可靠性需求无法锁定的重要数据时,快照非常给力。传统的备份方法在将文件复制到备份媒体上时通常要将文件锁定。快照允许你在复制的同时,保证运行关键任务的Web服务器或数据库服务器继续工作。LVM2允许创建在线逻辑卷的可读写快照。这个功能对快速故障转移或涉及修改数据的程序试验(如果失败,需要恢复修改过的数据)非常有用。
-
条带化
条带化(striping),可跨多个物理硬盘创建逻辑卷。当Linux LVM将文件写入逻辑卷时,文件中的数据块会被分散到多个硬盘上。每个后继数据块会被写到下一个硬盘上。
条带化有助于提高硬盘的性能,因为Linux可以将文件的多个数据块同时写入多个硬盘,而无需等待单个硬盘移动读写磁头到多个不同位置。读取顺序访问文件同样如此,LVM可同时从多个硬盘读取数据。
Notice: LVM条带化不同于RAID条带化。LVM条带化不提供用来创建容错环境的校验信息。事实上,LVM条带化会增加文件因硬盘故障而丢失的概率。单个硬盘故障可能会造成多个逻辑卷无法访问。
-
镜像
和物理分区一样,LVM逻辑卷也容易受到断电和磁盘故障的影响,一旦文件系统损坏,就有可能再也无法恢复。对于涉及大量数据变动的系统,比如数据库服务器,自上次快照之后可能要存储成百上千条记录。
LVM镜像可以解决这一问题。
LVM镜像的特点: 1.镜像是一个实时更新的逻辑卷的完整副本。创建镜像逻辑卷时,LVM会将原始逻辑卷同步到镜像副本中。 2.同步完成后,LVM会为文件系统的每次写操作执行两次写入—————一次写入到主逻辑卷,一次写入到镜像副本。这会降低系统的写入性能。
5.3.3 使用Linux LVM
如何创建LVM来帮助组织系统上的磁盘空间。
-
定义物理卷
将硬盘上的物理分区转换成Linux LVM使用的物理卷区段。使用fdisk命令,-t 改变分区类型。
用分区来创建实际的物理卷。用pvcreate命令来完成--- sudo pvcreate /dev/sdb1,用pvdisplay命令来显示一创建的物理卷列表。
-
创建卷组
从物理卷中创建一个或多个卷组,使用vgcreate命令
$ sudo vgcreate Voll /dev/sdb1 Volume group "Voll" successfully created $ vgcreate命令需要一些命令行参数来定义卷组名以及用来创建的物理卷名。 sudo vgdisplay Voll 显示创建卷组的细节。
-
创建逻辑卷
使用lvcreate命令来创建逻辑卷。
lvcreate命令选项:
选项 长选项名 描述 -c --chunksize 指定快照逻辑卷的单位大小 -C --contiguous 设置或充值连续分配策略 -i --stripes 指定条带数 -I --stripesize 指定每个条带的大小 -l --extents 指定非陪给新逻辑卷的逻辑区段数,或者要用的逻辑区段的百分比 -L --size 指定分配给新逻辑卷的硬盘大小 --minor 指定设备的次设备号 -m --mirrors 创建逻辑卷镜像 -M --persistent 让次设备号一直有效 -n --name 指定新逻辑卷的名称 -p --permission 为逻辑卷设置读/写权限 -r --readahead 设置预读扇区数 -R --regionsize 指定将镜像分成多大的区 -s --snapshot 创建快照逻辑卷 -z --zero 将新逻辑卷的前1KB数据设置为零 示例: $ sudo lvcreate -l 100%FREE -n lvtest Voll Logical volume "lvtest" created $ sudo lvdisplay Voll 命令查看创建的逻辑卷的详细情况。
-
创建文件系统
$ sudo mkfs.ext4 /dev/Voll/lvtest #创建ext4的文件系统 $ $ sudo mount /dev/Voll/lvtest /mnt/my_partition #挂载逻辑卷到/mnt/my_partition
-
修改LVM
Linux LVM的好处在于能够动态修改文件系统。
Linux LVM常用的修改命令如下:
命令 功能 vgchange 激活和禁用卷组 vgremove 删除卷组 vgextend 将物理卷加到卷组中 vgreduce 从卷组中删除物理卷 lvextend 增加逻辑卷的大小 lvreduce 减小逻辑卷的大小
6.安装软件程序
- 安装软件
- 使用Debian包
- 使用Red Hat包
6.1 基于Debian的系统
dpkg命令是基于Debian系PMS工具的核心。
- apt-get
- apt-cache
- aptitude
aptitude工具本质是apt工具和dpkg的前端。dpkg是软件包管理系统工具,而aptitude则是完整的软件包管理系统。
6.1.1 用aptitude管理软件包
aptitude show package_name # 显示软件包详细信息
示例:
$ aptitude show mysql-client # 显示包mysql-client的详情
# 注:无法通过aptitude看到一个细节是所有跟某个特定软件包相关的所有文件的列表,可用dpkg命令实现
dpkg -L package_name
示例:
$ dpkg -L vim-common # dpkg列出vim-common软件包所安装的全部文件
dpkg --search absolute_file_name # 查找某个特定文件属于哪个软件包,使用时必须用绝对文件路径
示例:
$ dpkg --search /usr/bin/xxd
vim-common: /usr/bin/xxd
$
6.1.2 用aptitude安装软件包
aptitude search package_name #搜索软件包
示例:
$ aptitude search wine
$
aptitude install package_name #安装软件包
$
$ aptitude install wine
$
6.1.3 用 aptitude 更新软件
aptitude safe-upgrade # 此命令部不需要使用软件包名称作为参数。因为safe-upgrade选项会将所有已安装的包更新到软件仓库中的最新版本,更利于系统稳定
6.1.4 用 aptitude 卸载软件
remove 选项是只删除软件包而不删除数据和配置文件
$ aptitude remove wine
purge 选项是把软件包和相关的数据和配置文件都删除
$ aptitude purge wine
# 注:要看软件包是否已删除,可以再用aptitude的search选项。如果在软件包名称的前面看到一个c,意味着软件已删除,但配置文件尚未从系统删除;如果前面是个p的话,说明配置文件也已删除。
6.1.5 aptitude 仓库
aptitude软件仓库具体存储位置在文件 /etc/apt/sources.list 中。
可用下面的结构来指定仓库源
deb (or deb-src) address distribution_name package_type_list
deb或deb-src的值表明了软件包的类型。
address条目是软件仓库的web地址
distribution_name条目是这个特定软件仓库的发行版版本的名称
package_type_list 条目可能不止一个词,它还表明仓库里面有什么类型的包
6.2 基于 Red Hat 的系统
yum:在Red Hat和Fedora中使用
urpm:在Mandriva中使用
-
zypper:早openSUSE中使用
这些都是基于rpm命令行工具
6.2.1 列出已安装包
$ yum list installed
$ yum list installed > installed_software
# yum擅长找出某个特定软件包的详细信息。
$ yum list xterm
# yum能够找到系统上某个特定文件属于哪个软件包
$ yum provides file_name
$ yum provides /etc/yum.conf # 示例
6.2.2 用 yum 安装软件
yum install package_name
$ yum install xterm
# 可以手动下载rpm安装文件并用yum安装,也叫作 本地安装,基本命令是:
$ yum localinstall package_name.rpm
6.2.3 用 yum 更新软件
yum list updates # 列出所有安装包的可用更新
yum update package_name # 对特定的软件包进行更新
yum update # 对更新表中所有的包进行更新
6.2.4 用 yum 卸载软件
yum remove package_name # 只删除软件包而保留配置文件和数据文件
yum erase package_name # 删除软件包所有的文件
6.2.5 处理损坏的包依赖关系
有时在安装多个软件包时,某个包的软件依赖关系可能会被另一个包的安装覆盖掉,这叫作损坏的包依赖关系(broken dependency)
$ yum clean all # 清理放错位置的文件
$ yum deplist package_name # 显示所有包的库依赖关系以及什么软件可以提供这些库依赖关系
$ yum update --skip-broken # --skip-broken选项允许你忽略依赖关系损坏的那个包,继续区更新其他软件包,这可能救不了损坏的包,但至少可以更新系统上的其他包。
6.2.6 yum 软件仓库
yum repolist # 列出软件的仓库
yum 的仓库定义的文件位于/etc/yum.repos.d ,需要添加正确的URL,并获得必要的加密密钥
6.3 从源码安装
以 安装sysstat软件包为例,先是在官网下载它的tarball形式的软件包--sysstat-11.1.1.tar.gz
$ tar -zxvf sysstat-11.1.1.tar.gz # 解压软件包
$ cd sysstat-11.1.1 # 进入sysstat-11.1.1解压目录
$ ls # 在目录列表中,应该能够看到README或AAAREADME文件。这个文件包含和该软件安装所需要的操作。
$ ./configure # 检查配置信息
$ make # make命令编译源码和链接器为这个包创建最终的可执行文件
$ make install # 安装sysstat包
7. 使用编辑器
- vim编辑器
- nano编辑器
- emacs编辑器
- KWrite编辑器
- Kate编辑器
- GNOME编辑器
7.1 vim编辑器
7.1.1 vim基础
Ubuntu环境中安装vim软件
$ sudo apt-get install vim
.
.
.
$ readlink -f /usr/bin/vi
/usr/bin/vim.basic
$
$ vim myprog.c
# 只要键入vim或vi命令和要编辑的文件的名字就可以启动vim编辑器,如果指定文件不存在,vim会开辟一段新的缓冲区来编辑。
vim编辑器有两种操作模式:
- 普通模式----打开新建文件时,vim编辑器会进入普通模式,vim会将按键解释成命令
- 插入模式----按下i键可进入插入模式,按esc键退出插入模式回到普通模式
普通模式中的一些键的使用:
h:左移一个字符
j:下移一行(文本中的下一行)
k:上移一行(文本中的上一行)
l:右移一个字符
PageDown(或Ctrl+F):下翻一屏
PageUp(或Ctrl+B):上翻一屏
G:移到缓冲区的最后一行
num G:移动到缓冲区的第num行
gg:移到缓冲区的第一行
vim编辑器普通模式下的命令行模式---按冒号键进入。
q:如果未修改缓冲区数据,退出
q!:取消所有对缓冲区数据的修改并退出
w filename:将文件保存到另一个文件中
wq:将缓冲区数据保存到文件中并退出
7.1.2 编辑数据
在插入模式下,可以向缓冲区插入数据。
vim编辑命令表:
命令 | 描述 |
---|---|
x | 删除当前光标所在位置的字符 |
dd | 删除当前光标所在行 |
dw | 删除当前光标所在位置的单词 |
d$ | 删除当前光标所在位置至行尾的内容 |
J | 删除当前光标所在行行尾的换行符(拼接行) |
u | 撤销前一编辑命令 |
a | 在当前光标后追加数据 |
A | 在当前光标所在行行尾追加数据 |
r char | 用char替换当前光标所在位置的单个字符 |
R text | 用text覆盖当前光标所在位置的数据,知道按下ESC键 |
有些编辑命令允许使用数字修饰符来指定重复该命令多少次。比如,命令2x会删除从光标当前位置开始的两个字符,命令5dd会删除从光标当前所在行开始的5行。
7.1.3 复制和粘贴
vim在删除数据时,实际上会将数据保存在单独的一个寄存器中。
yy:复制 nyy:向下复制n行
p:粘贴在下一行,P粘贴到上一行 (一定要和yy连用)
u:复原上一个操作
ctrl+r:重做上一个操(和u一起用)
.:重复上一个操作(复制,粘贴)
7.1.4 查找和替换
查找:输入一个查找字符------按下斜线(/)键,光标会跑到消息行,输入查找的文本,按下回车键。
替换:命令格式------ :/s/old/new/,用new来替代old内容
:s/old/new/g:一行命令替换所有old
:n,ms/old/new/g:替换行号n和m之间所有的old
:%s/old/new/g:替换整个文件中的所有old
:%s/old/new/gc:替换整个文件中的所有old,但在每次出现时提示
7.2 nano 编辑器
nano是一款简单易用的控制台模式文本编辑器,大多数Linux发行版都默认安装了nano文本编辑器。
CentOS:执行yum -y install nano
Debian:执行apt-get install -y nano
nano 路径/文件名 # 创建或打开文件
脱字符()表示Ctrl键,X表示的就是组合键Ctrl+X
nano控制命令:
命令 | 描述 |
---|---|
CTRL+C | 显示光标在文本编辑器缓冲区中的位置 |
CTRL+G | 显示nano的主帮助窗口 |
CTRL+J | 调整当前文本段落 |
CTRL+K | 剪切文本行,并将其保存在剪切缓冲区 |
CTRL+O | 将当前文本编辑缓冲区的内容写入文件 |
CTRL+R | 将文本读入当前文本编辑缓冲区 |
CTRL+T | 启动可用的拼写检查器 |
CTRL+U | 将剪切缓冲区中的内容放入当前行 |
CTRL+V | 翻动到文本编辑缓冲区中的下一页内容 |
CTRL+W | 在文本编辑缓冲区中搜索单词或短语 |
CTRL+X | 关闭当前文本编辑缓冲区,退出nano,返回shell |
CTRL+Y | 翻动到文本编辑缓冲区中的上一页内容 |
7.3 emacs 编辑器
安装emacs编辑器,它有控制台模式和图形模式
$ sudo apt-get install emacs # Ubuntu发行版安装
.
.
$ sudo yum install emacs # CentOS发行版安装
7.3.1 控制台中更实用emacs
emacs编辑器使用包括控制键(PC键盘上的Ctrl键,C-)和Meta键(Alt键,M-)组合使用。
例如:要输入Ctrl+x组合键,文档显示成C-x。
使用emacs编辑文件:
$ emacs test.c # 创建或打开文件tes.c
emacs编辑器移动光标的命令:
命令 | 描述 |
---|---|
C-p | 上移一行(文本中的前一行) |
C-b | 左移一字符 |
C-f | 右移一字符 |
C-n | 下移一行(文本中的下一行) |
M-f | 右移到下个单词 |
M-b | 左移到上个单词 |
C-a | 移至行首 |
C-e | 移至行尾 |
M-a | 移至当前句首 |
M-e | 移至当前句尾 |
M-v | 上翻一屏 |
C-v | 下翻一屏 |
M-< | 移至文本的首行 |
M-> | 移至文本的尾行 |
C-x C-s | 保存当前缓冲区到文件 |
C-z | 退出emacs并保存在这个会话中继续进行,以便你切回 |
C-x C-c | 退出emacs并停止该程序 |
表中,C-x命令叫做扩展命令,提供了另一组命令
7.3.2 在GUI环境中使用 emacs
7.4 KDE 系编辑器
如果所用的Linux发行版中采用的是KDE桌面,那么KDE项目官方有两种流行的文本编辑器。
- KWrite:单屏幕文本编辑程序
- Kate:功能全面的多窗口文本编辑程序
7.5 GNOME 编辑器
7.5.1 启动 gedit
大多数的GNOME桌面环境都将gedit放在Accessories面板菜单条目中,Unity桌面环境中,进入Dash-->Search-->输入gedit。或从命令行输入命令启动:
$ gedit file.sh new.c # 打开两个文件
7.5.2 基本的 gedit 功能
工具栏条目:
- File:处理新文件、保存已有文件以及打印文件
- Edit:在工作缓冲区域操作文本并设定编辑器偏好设置
- View:设定显示在窗口中的编辑器功能以及文本的高亮显示模式
- Search;在工作缓冲区域查找和替换文本
- Tools:访问安装在gedit上的插件工具
- Documents:管理缓冲区中打开文件
- Help:访问完整的gedit手册