LPI Linux 认证/LPIC1 考试 101/GNU & Unix 命令
- 1.103.1 在命令行上工作
- 1.103.2 使用过滤器处理文本流
- 1.103.3 执行基本文件管理
- 1.103.4 使用流、管道和重定向
- 1.103.5 创建、监控和杀死进程
- 1.103.6 修改进程执行优先级
- 1.103.7 使用正则表达式搜索文本文件
- 1.103.8 使用 VI 执行基本文件编辑操作
- Unix 和 Linux
Unix 是最初的互联网操作系统(NFS、TCP/IP、RPC、...)。Linux 是一个 Unix 克隆,由 Linus Torvalds 独立编写,并得到了来自全球网络开发人员团队的帮助。这两个系统的特性包括:
- 可移植性、多用户、多处理
- 设备无关的输入/输出
- 共享资源、高性能和高度安全
- 行命令
- 图形用户界面
Linux 旨在实现 POSIX 兼容性,也支持其他标准 API,如 BSD 和 SVR4。Linux 具有您在现代 Unix 中期望的所有功能,包括真正的多任务/多用户、虚拟内存、共享库、按需加载、共享的写时复制可执行文件、适当的内存管理和 TCP/IP 网络。
越来越多的公司和组织选择 Linux,因为它具有高性能、低成本和免版税的许可证。
Unix 是最初的互联网操作系统,编写于 1970 年,由 AT&T 贝尔实验室开发。免费分发给政府和大学。不同的实体支持不同的发行版。
- System V
- BSD
- SCO
大多数版本的 Unix 都有版权许可证。
Linux 由 Linus Torvalds 于 1991 年发布。Linux 许可证的模式来自 GPL 的复制左。Linux 实现了大多数 System V 和 BSD Unix 命令。使用手册页确定版本。
登录会话是访问 Linux 系统的第一步。您需要登录 ID 和密码才能开始使用系统。登录 ID root 是超级用户 ID,拥有所有权限,通常分配给系统管理员。当登录会话成功时,它将设置一些环境变量并启动分配给登录 ID 帐户的 Shell。
登录时设置的变量示例:$HOME、$SHELL、$PATH 等。通过更改文件 /etc/login.defs,管理员可以为所有用户自定义一些登录参数和变量。
其中一些示例
UID_MIN 500 UID_MAX 60000 UMASK 022 ENV_PATH /usr/local/bin:/usr/bin:/bin
要注销,请使用 exit 或 logout 命令。
没有人能看到您的密码,即使是管理员也不行。要更改用户或组的密码,请使用 passwd。
passwd [options]
常用选项
- -l, -u : 锁定和解锁帐户。
- -g [| r]: 用于组。
- -g 设置组密码,-r 移除密码。
- -x|n : 密码有效期最长和最短天数。
一般来说,密码必须
- 具有最小长度
- 不包含任何英文单词
- 包含非字母数字字符
- 包含大小写字母的混合。
用户信息
[edit | edit source]每个用户帐户在文件中都有一行定义/etc/passwd. 加密后的密码存储在/etc/shadow. 的格式是/etc/passwd是
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/bin/bash daemon:x:2:2:Daemon:/sbin:/bin/bash yann:x:500:100:Yann Forget:/home/yann:/bin/bash
x 字段是密码的旧位置。
的格式是/etc/shadow是
root:IMXweyiV816gg:11996:0:10000:::: bin:!*:8902:0:10000:::: daemon:*:8902:0:10000:::: yann:GoIM8j1S.IuTY:11996:0:99999:7:::
加密密码的 * 表示尚未定义密码。加密密码之前的 ! 表示帐户已锁定。
组信息
[edit | edit source]每个用户组在文件中都有一行/etc/group. 加密后的密码存储在/etc/gshadow. 的格式是/etc/group是
root:x:0:root bin:x:1:root,bin,daemon daemon:x:2: video:x:33:yann
/etc/gshadow 的格式是
root:*:root:root bin:*:root:root daemon:*:root:root video:*:root:root,yann
组密码很少实现,因为您必须将密码传递给组成员。
其他命令
[edit | edit source]要获取有关登录会话的信息,请使用 id。
id [options] [username]
常用选项:-g : 只打印组 ID。-u : 只打印用户 ID。
示例
$ id uid=0(root) gid=0(root) groups=0(root), 1(bin), 14(uucp), 15(shadow),16(dialout)
要使用其他用户 ID 和组 ID 运行 shell,请使用 su。
su [options] [username]
常用选项:-s : 选择其他 shell。
示例
$ su toto passwd:
Shell
[edit | edit source]Shell 是一个命令行解释器,
- 提示输入命令。
- 解释命令,其中可能包括
- I/O 重定向、管道、文件名生成等。
- 执行命令。
- 执行脚本语言。
有几个流行的 shell
- sh: Bourne shell,标准脚本 shell。
- csh: Berkeley shell,作业控制、命令历史记录、别名。
- ksh: Korn shell,Bourne 语法,具有 Berkeley 功能。
- bash: Bourne Again shell,免费的 Korn 类 shell。
- t csh: 免费的 Berkeley 克隆,具有许多扩展。
大多数 shell 允许您自定义提示和环境。对于 bash,提示变量是 PS1。对于 bash,可用于自定义环境的文件是
- .bashrc 针对每个新的 bash 会话执行
- .bash_profile 在登录时执行
- .bash_logout 在注销时执行
练习
[edit | edit source]使用过滤器处理文本流
[edit | edit source]概述
[edit | edit source]描述:考生应能够将过滤器应用于文本流。任务包括通过文本实用程序过滤器发送文本文件和输出流以修改输出,以及使用 GNU textutils 包中找到的标准 UNIX 命令。
关键文件术语和实用程序包括
cat
cut
expand
fmt
head
join
nl
od
paste
pr
sed
sort
split
tac
tail
tr
unexpand
uniq
wc
模式匹配和通配符
[edit | edit source]通配符是用于文件名的模式匹配机制。通配符的目的是提高生产力:找到您不完全记得的文件。找到具有某些共同点的文件。使用一组文件而不是单个文件。
shell 解释这些特殊字符
! @ # $ % ^ & * ( ) { } [ ] | \ ; ~ ' " ` ?
用于通配符的字符是
? * [ ] ~
如果您使用通配符,shell 将尝试从它们生成一个文件。尝试以下操作
echo all files *
特殊通配符
? match any one character. * Any string [abcfghz] One char set [a-z] One char in range [!x-z] Not in set ~ Home directory ~user User home directory
示例
? One character filenames only [aA]??? Four characters, starting with a or A. ~toto pathname of toto home directory [!0-9]* All string not starting with a number.
这些命令呢?
ls [a-z][A-Z]??.[uk] ls big* ls a???a ls ??*
Shell 和通配符
[edit | edit source]shell 命令行可以是简单的命令或更复杂的命令。
ls -l [fF]* ls *.c | more ls -l [a-s]* | mail `users`
shell 中的第一件事是解释通配符。只有 shell 解释未引用的通配符。
引用和注释
[edit | edit source]引用
[edit | edit source]引用是为了防止 shell 解释特殊字符并将多个单词转换为一个 shell 单词。
- 'string' 引号内的几乎所有内容都是文字
echo 'He did it, "Why?"' echo 'Because "#@&^:-)"' echo '$VAR='Me
- "string" 与 'string' 相似,但解释 $、\、 !
echo "What's happening?" echo "I don't know but check this $ANSWER"
- 反斜杠 \ 将下一个字符视为文字
echo \$VAR=Me echo What\'s happening\?
- 我们如何显示反斜杠?使用以下行
echo \\
注释
[edit | edit source]您可以在命令行或脚本中添加注释。使用字符 #。空格必须紧接在 # 之前。
示例
echo $HOME # Print my Home directory echo "### PASSED ###" # Only this part is a comment echo The key h#, not g was pressed.
命令
- cat、tac:连接文件并打印到标准输出。
- head、tail:输出文件的开头和结尾部分。
- nl:对文件进行编号。
- wc:打印文件中的字节数、单词数和行数。
- cut:从文件的每一行中删除部分。
- tr:转换或删除字符。
- expand、unexpand:将制表符转换为空格,将空格转换为制表符。
- paste:合并文件中的行。
- join:根据公共字段连接两个文件中的行。
- uniq:从排序文件中删除重复行。
- split:将文件拆分为多个片段。
- fmt:简单的最佳文本格式化程序。
- pr:转换文本文件以进行打印。
- sort:对文本文件的行进行排序。
- od:以八进制和其他格式转储文件。
连接文件
[edit | edit source]要连接文件,请使用 cat。
cat [options] [files...] tac [options] [files...]
结果显示在标准输出中。
常用选项
-s: never more than one single blank line. -n: number all output line.
示例
cat file # Display file to the stdout. cat chapter* # Display all chapters to stdout. cat -n -s file # Display file with line number with single blank line.
要以相反的顺序连接文件,请使用 tac。
查看文件的开头和结尾
[edit | edit source]要查看文件开头或结尾的几行,请使用 head 或 tail。
head [options] [files...] tail [options] [files...]
结果显示在标准输出中。
常用选项
-n: number of lines to be displayed. (head and tail) -c: number of bytes to be displayed. (head and tail) -f: append output. (tail) -s #: iteration for new data every # sec. (tail)
示例
head file # Display the first 10 lines of file. head -n 2 file # Display the first 2 lines of file. tail -c 10 file # Display the last 10 bytes of file. tail -f -s 1 /var/log/messages Display the last 10 lines of messages, block and check for new data every second.
对文件行进行编号
[edit | edit source]要将行号添加到文件,请使用 nl。
nl [options] [files...]
结果显示在标准输出中。
常用选项
-i #: increment line number by #. -b: numbering style: a: number all lines t: non empty line n: number no line -n: numbering format: rz: right justified ln: left justified.
示例
nl file # Add the line number in each line in the file. nl -b t -n rz file # Add the line number to each non-empty line with zero-completed format.
统计文件中的项目
[edit | edit source]要打印文件的行数、单词数和字符数,请使用 wc。
wc [options] [files...]
结果显示在标准输出中。
常用选项
-c: the byte size. -m: the number of character. -w: the number of word. -l: the number of line. -L: length of the longest line.
示例
wc *.[ch] # Display the number of lines, words, and characters for all files .c or .h. wc -L file # Display the size of the longest line. wc -w file # Display the number of words.
剪切文件中的字段
[edit | edit source]要从文件的每一行中删除部分,请使用 cut。
cut [options] [files...]
结果显示在标准输出中。
常用选项
-b #: Extract the byte at position #. -f #: Extract the field number #.
示例
cut -b 4 file # Extract and display the 4th byte of each line of file. cut -b 4,7 file # Extract and display the 4th and 7th byte of each line. cut -b -2,4-6, 20- file # Extract character 1 and 2, 4 to 6 and 20 to the end of the line for each line of file. cut -f 1,3 -d: /etc/passwd # Extract the username and ID of each line in /etc/passwd.
默认分隔符是 TAB,但可以使用 -d 指定。
字符转换
[edit | edit source]要将标准输入转换为标准输出,请使用 tr。
tr [options] SET1 SET2
常用选项:-d:删除 SET1 中的字符。-s:将 SET1 中的字符序列替换为一个。
示例
tr ‘a‘ 'A' # Translate lower a with A tr ‘[A-Z]’ ‘[a-z]’ # Translate uppercase to lowercase tr -d ‘ ‘ # Delete all spaces from file
要将制表符转换为空格,请使用 expand,要将空格转换为制表符,请使用 unexpand。
expand file unexpand file
行操作
[edit | edit source]要粘贴多个文件的多行,请使用 paste。
paste [options] [files...]
常用选项
-d #: delimiter: Use # for the delimiter. -s: serial: paste one file at the time.
示例
paste f1 f2 # Display line of f1 followed by f2. paste -d: file1 file2 # Use ':' for the delimiter.
要连接多个文件的多行,请使用 join。
join file1 file2
要删除重复行,请使用 uniq。
uniq [options] [files...]
常用选项
-d: only print duplicated lines. -u: only print unique lines.
示例
uniq -cd file # Display the number of duplicated line.
拆分文件
要拆分大文件,请使用 split。
split [options] file
常用选项
-l #: split every # lines. -b #: split file in bytes or b for 512 bytes, k for 1Kbytes, m for 1 Mbytes.
示例
split -l 25 file # Split file into 25-line files. split -b 512 file # Split file into 512-byte files. split -b 2b file # Split file into 2*512-byte files.
打印格式
[edit | edit source]要格式化文件,请使用 fmt。
fmt [options] [files...]
常用选项:-w #:最大行宽。
示例
$ fmt -w 35 file # Display 35-character lines width.
要格式化打印机的文件,请使用 pr。
pr [options] [files...]
常用选项:-d:双倍行距。
示例
$ pr -d file # Format file with double-space.
对文本文件进行排序
[edit | edit source]要对文件名中的行进行排序,请使用 sort。
sort [options] file
结果显示在标准输出中。
常用选项
-r : Reverse -f : Ignore case -n : Numeric -o file: Redirect output to file -u : No duplicate records -t; : Use ';' as delimiter, rather than tab or space.
示例
sort file -r sort file -ro result
二进制文件转储
[edit | edit source]要转储二进制文件,请使用 od。
od [options] file
结果显示在标准输出中,并以八进制的偏移地址开头。
常用选项
-c: each byte as character -x: 2-byte in hex -d: 2-byte in decimal -X: 4-byte in hex. -D: 4-byte in decimal.
示例
$ od -cx /bin/ls 0000000 177 E L F 001 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0 457f 464c 0101 0001 0000 0000 0000 0000 0000020 002 \0 003 \0 001 \0 \0 \0 224 004 \b 4 \0 \0 \0 0002 0003 0001 0000 9420 0804 0034 0000 0000040 ° ² \0 \0 \0 \0 \0 \0 4 \0 \0 006 \0 ( \0 b2b0 0000 0000 0000 0034 0020 0006 0028 0000060 032 \0 031 \0 006 \0 \0 \0 4 \0 \0 \0 4 200 004 \b 001a 0019 0006 0000 0034 0000 8034 0804
练习
[edit | edit source]- 使用通配符,列出 /etc 目录中所有包含 'x' 后跟 'in' 的文件名。
- 使用通配符,列出所有以 'a' 到 'e' 之间的任何字符开头,至少包含两个字符,且不以数字结尾的文件名。
- 使用通配符,列出所有精确包含 4 个字符的文件名,以及所有以大写字母开头的文件名。不要进入找到的任何目录。
- 使用通配符,列出 /bin 中所有包含 'sh' 的文件。
- 显示你的环境变量 HOME,前面加上字符串 "$HOME value is:"。
- 显示 $SHELL 的内容,前后加上两个星号字符。
- 如何使用双引号和反斜杠,通过 echo 显示以下字符字符串?
- @ # $ % ^ & * ( ) ' " \
- 编写 echo 命令来显示以下两个字符串
- That's what he said!
- 'Never Again!' he replied.
- 显示 /etc 目录中所有以字母 h 开头的文件中的单词数量。
- 如何使用两张 1.44M 软盘发送一个 2M 文件?如何将拆分文件的各个部分拼合在一起?
- 将 /etc/password 中的 : 分隔符转换为 # 的命令是什么?
执行基本文件管理
[edit | edit source]概述
[edit | edit source]描述:候选人应该能够使用基本的 UNIX 命令来复制、移动和删除文件和目录。任务包括高级文件管理操作,例如递归复制多个文件、递归删除目录以及移动符合通配符模式的文件。这包括使用简单和高级通配符规范来引用文件,以及使用 find 来查找并根据类型、大小或时间对文件进行操作。
关键文件术语和实用程序包括
cp
find
mkdir
mv
ls
rm
rmdir
touch
文件通配
cp:复制文件和目录。ls:列出目录内容。
创建和删除目录
[edit | edit source]要创建目录,请使用 mkdir。
mkdir [options] dir
常用选项
-m mode: set permission mode. Default use umask. -p parent: create parent directory as needed.
示例
mkdir -m 0700 bin mkdir -p bin/system/x86
要删除空目录,请使用 rmdir。
rmdir [options] dir
常用选项
-p parent: remove empty subdirectories.
示例
rmdir tmp rmdir -p bin/system/x86
复制文件和目录
[edit | edit source]要将一个文件复制到另一个文件或目录中,请使用 cp。
cp [options] source target
源和目标可以是文件或目录。
常用选项
-i interactive: prompt to overwrite -r recursive: copy the subdirectories and contents. Use -R for special files. -f force: force the overwriting
默认情况下,将静默覆盖目标文件。不会改变源文件。
示例
cp *.[a-z] /tmp cp readme readme.orig cp ls /bin cp -ri bin/* /bin
移动和重命名文件
[edit | edit source]要重命名文件或目录,或将文件或目录移动到另一个位置,请使用 mv。
mv [options] source target
源和目标可以是文件或目录。
常用选项
-i interactive: prompt to overwrite -f force: force the overwriting -v verbose
默认情况下,将静默覆盖目标文件。
示例
mv *.[a-z] /tmp mv readme readme.orig mv ls /bin mv -fi bin/* /bin
列出文件名和信息
[edit | edit source]列出当前目录中的文件的命令是 ls。
ls [options] [filenames]
常见选项是
-l for a long format -F Append a file type character -a All files, including hidden -R Recursive listing of subtree -d Do not descend into directory
ls 等效于 DOS 上的 dir 命令。
ls 输出示例
$ ls -l /bin/ls -rwxr-xr-x 1 root root 46784 mar 23 2002 /bin/ls $ ls -ld /bin drwxr-xr-x 2 root root 2144 nov 5 11:55 /bin $ ls -a . .bash_history .bash_profile .bashrc ... $ ls -dF /etc .bashrc /bin/ls .bashrc /bin/ls* /etc/
文件类型
[edit | edit source]长格式表示
$ ls -l /etc/hosts #List a long format of the file hosts -rw-r—r-- 1 root root 677 Jul 5 22:18 /etc/hosts
文件内容和位置 Linux/Unix 不通过文件名扩展名区分文件,例如 Windows。要确定文件内容,请使用 file。
$ file /etc .bashrc /bin/ls /dev/cdrom /etc: directory .bashrc: ASCII English text /bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), stripped /dev/cdrom: symbolic link to /dev/hdc
要确定命令是内置的 shell 命令还是程序,请使用 type,并使用 which 查找其位置。
$ type cp cd ls which type cp is /bin/cp cd is a shell builtin ls is aliased to `ls $LS_OPTIONS' which is aliased to `type -p' type is a shell builtin $ which cut /usr/bin/cut
创建和使用文件名
[edit | edit source]文件名可以使用以下方法创建
- I/O 重定向
cat chapter1 chapter2 > book
- 编辑器,例如 vi。
vi mynewfile
- 许多 Unix 实用程序
cp file newfile
- 应用程序
netscape
- touch 命令,用于创建空文件(或更新现有文件的“修改日期”)
touch memo
有效的文件名可以包含
- 每个文件名最多 255 个字符
- 区分大小写 'A' 和 'a' 是不同的
- 除正斜杠 '/' 之外的任何字符
- 建议使用字母数字字符以及加号、减号和下划线字符。
- 要避免的字符
- 连字符。
- touch my-file -lt
- 空格。
touch more drink touch "more drink"
- 大多数其他特殊字符 !@#$%^&*():;"'}{|\<,>.?~`
touch memo*
要删除文件或子树目录,请使用 rm。
rm [options] files
文件可以是文件或目录。
常用选项
-i interactive: prompt to for each removal -f force: force the overwriting -r recursive: remove subtree directories and contents
没有 unremove 或 undelete 命令。
示例
rm *.[a-z] rm readme readme.orig rm ls /bin rm -rfi /bin cd; rm -rf * .* # !! this removes all files of in the home directory of the current user, as well as those in the subdirectories !!
要搜索子树目录中的文件,请使用 find。
find [subtrees] [conditions] [actions]
该命令可以接受多个条件,并将在子树中递归搜索。
一些可能的条件是
-name [FNG] # Search fo the FNG name -type c # Type of file [bcdfl] -size [+-]# # Has a +- size in blocks (c:bytes,k:kilo) -user [name] # Own by user -atime [+-]# # Accessed days ago +n means not been accessed for the last n days -n means been accessed the last ndays. -mtime [+-]# # Modified days ago -perm nnn # Has permision flags nnn
一些可能的动作是
-print # Print the pathname -exec cmd {} \; # Execute cmd on the file -ok cmd {} \; # Same as -exec but ask first
示例
find . -name '*.[ch]' -print find /var /tmp . -size +20 -print find ~ -type c -name '*sys*' -print find / -type f -size +2c -exec rm -i {} \; find / -atime -3 -print find ~jo ~toto -user chloe -exec mv {} /tmp \;
要查找二进制文件、源文件或手册页,请使用 whereis。
Whereis [options]
常用选项
-b: Search only for binaries. -m: Search only for manual sections. -s: Search only for sources.
示例
$ whereis host host: /usr/bin/host /etc/host.conf /usr/share/man/man1/host.1.gz $ whereis -m host host: /usr/share/man/man1/host.1.gz
要查找由 PATH 变量定义的位置的文件,请使用 which。
$ which -a ls /bin/ls
-a 将查找 PATH 中所有可能的匹配项,而不仅仅是第一个匹配项。
- 编写一个交互式命令,删除您主目录中的所有 .tmp 文件。对每个提示都回复 y。
- 列出所有用户主目录中以 .pdf 结尾、大小超过 50 个块且自上次访问已超过一个月的文件。
- 创建一个名为 file.h 的文件,其中包含在 /usr 目录中找到的所有以 .h 结尾的文件名。
- 对 /usr/src/packages 目录中找到的所有 c 文件进行 touch 操作。
- 创建新文件和新目录时的默认权限是什么?
- 如何创建文件名中包含空格的新文件或目录?(例如:'new dir')
- 删除您主目录中所有类型为字符和块的文件的命令是什么?
- 如何查找 find 程序的位置?
- 删除 /tmp 中所有不属于 root 且自上次访问已超过一周的文件。
- 练习结果.
描述:候选人应该能够重定向流并将它们连接起来,以便高效地处理文本数据。任务包括重定向标准输入、标准输出和标准错误,将一个命令的输出传递给另一个命令的输入,使用一个命令的输出作为另一个命令的参数,以及将输出发送到标准输出和文件。
关键文件术语和实用程序包括
tee
xargs
<
<<
>
>>
|
` `
对于在终端中执行的每个命令,都有:标准输入值 0(默认键盘)、标准输出值 1(默认终端)和标准错误输出值 2(默认终端)。
每个通道也可以通过地址标识:&0 表示输入,&1 表示输出,&2 表示错误。
每个通道 [n] 都可以重定向。[n]< 文件:n 的默认值为 0,它从文件读取标准输入。[n]> 文件:默认值为 1,它将标准输出发送到文件,如果文件存在则覆盖文件。(覆盖)[n]>>文件:默认值为 1,它将标准输出追加到文件。<<词:读取标准输入,直到遇到词为止。`命令`:用结果替换命令名。
示例
$ pwd > file # out=file in=none error=terminal.
cat chap* >book # out=book in=none error=terminal.
mv /etc/* . 2>error # out=terminal in=none error=error.
echo end of file >> book # out=book in=none error=terminal.
set -o noclobber # Shell does not clobber existing files.
ls > list 2>&1 # ls and errors are redirected to list.
ls 2>&1 > list # Errors are redirected to standard output and ls output is redirected to list.
cat `ls /etc/*.conf` > conffile 2>>/tmp/errors
将 /etc 目录中的所有配置文件连接到 conffile 中,并将错误追加到文件 /tmp/errors 中。
使用管道重定向
管道是同时应用多个命令的有效方法。
command1 | command2
命令 1 的标准输出将被管道传输到命令 2 的标准输入。标准错误不会被管道传输。
示例
ls -l /dev | more ls -l /etc/*.conf | grep user | grep 500 ls -l /bin | mail `users`
要将标准输出同时重定向到文件和终端,请使用 tee。
ls -l /dev | tee file ls -l /etc | tee -a file # Append to the file
构建参数
xargs 实用程序使用标准输入构建命令的参数列表。
xargs [options] [command]
xargs 命令从标准输入创建命令的参数列表。它通常与管道一起使用。
常用选项:-p:在执行每个命令之前提示用户。
示例
ls f* | xargs cat # Print to standard output the content of all files starting with f. find ~ -name 'proj1*' print | xargs cat
在 Home 目录中搜索以 proj1 开头的文件,并将它们发送到 cat 的标准输入。
使用 /dev/null 设备文件丢弃输出或错误消息。
尝试以下操作
grep try /etc/* grep try /etc/* 2> /dev/null grep try /etc/* > /dev/null 2> /dev/null
- 创建一个名为 list.bin 的文件,其中包含 /bin 目录中的所有文件名。
- 编写一个命令,将 /usr/local/bin 中的文件列表追加到名为 list.bin 的文件中,并丢弃所有错误输出。
- 将 list.bin 文件拆分为 50 行长的文件,并删除 list.bin。
- 从拆分的文件中重新创建 list.bin,但以反向顺序。
- 简化以下命令
ls *.c | xargs rm ls [aA]* | xargs cat cat `ls *.v` 2>/dev/null
- 使用 find 执行以下命令
more `ls *.c`
- 编写一个命令,创建一个名为 list.sbin 的文件,其中包含 /sbin 的内容,同时将内容显示到标准输出。
- 创建一个文件,在文件名中包含创建时间。
- 创建一个文件,其中包含 /etc 目录中以 .conf 结尾的所有文件名,以反向顺序排列。
- 练习结果.
描述:候选人应该能够管理进程。这包括了解如何在前台和后台运行作业,将后台作业移到前台,反之亦然,启动一个在没有连接到终端的情况下运行的进程,以及向程序发送信号以在注销后继续运行。任务还包括监控活动进程,选择和排序要显示的进程,向进程发送信号,杀死进程,以及识别和杀死在 X 会话关闭后未终止的 X 应用程序。
关键文件术语和实用程序包括
&
bg
fg
jobs
kill
nohup
ps
top
正在运行的应用程序是一个进程。每个进程都有:进程 ID。父进程 ID。当前目录 PWD。文件描述符表。正在执行的程序。环境变量,从其父进程继承而来。标准输入、标准输出和标准错误 其他
Bash 是一个程序,当它被执行时就会变成一个进程。每次您在 shell 中执行命令时,都会创建一个新进程。除了 shell 内置命令。它们在 shell 上下文中运行。使用 type 检查命令是否为 shell 内置命令。
例如 type cp ls which type 监控进程 系统启动并运行后,从终端可以使用 ps 程序查看哪些进程正在运行。要显示系统中所有进程的详细信息,请执行
ps -Al F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 004 S 0 1 0 0 80 0 - 112 do_sel ? 00:00:04 init 004 S 0 381 1 0 80 0 - 332 do_sel ? 00:00:00 dhcpcd 006 S 0 1000 1 0 80 0 - 339 do_sel ? 00:00:00 inetd 044 R 0 1524 1222 0 79 0 - 761 - pts/3 00:00:00 ps
ps 程序将显示所有正在运行的进程及其 PID 号和其他信息。要查看您登录会话中的进程详细信息,请执行
ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 000 S 500 1154 1139 0 80 0 - 724 wait4 pts/1 00:00:00 bash 002 S 500 1285 1283 0 77 0 - 24432 wait_f pts/1 00:00:00 soffice.bin 040 R 500 1442 1435 0 79 0 - 768 - pts/4 00:00:00 ps F: Process Flags 002: being created, 040: forked but didn't exec, 400: killed by a signal. S: Process States: R: runnable, S: sleeping, Z: zompbie UID: User ID, PID: Process ID, PPID: Parent Process ID, C: Scheduler, PRI: priority NI: Nice value, SZ: size of routine, WCHAN: name of routine
要实时监控进程,请使用 top。top
9:20am up 2:48, 4 users, load average: 0.15, 0.13, 0.09
78 个进程:75 个睡眠,3 个运行,0 个僵尸,0 个停止 CPU 状态:15.3% 用户,0.3% 系统,0.0% 优先级,84.2% 空闲 内存:254896K 可用,251204K 使用,3692K 空闲,0K 共享,27384K 缓冲 交换:514072K 可用,0K 使用,514072K 空闲 120488K 缓存
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 1517 rarrigon 0 0 40816 39M 17372 R 15.0 16.0 2:59 mozilla-bin 1727 rarrigon 19 0 988 988 768 R 0.3 0.3 0:00 top 1 root 20 0 220 220 188 S 0.0 0.0 0:04 init 2 root 20 0 0 0 0 SW 0.0 0.0 0:00 keventd
RSS:任务使用的物理内存总量。SHARE:任务使用的共享内存量。%CPU:任务占用的 CPU 时间比例。%MEM:任务占用的物理内存比例。一旦 top 运行,也可以执行交互式命令:键入 N 按 pid 对任务进行排序。键入 A 按年龄对任务进行排序(最新的排在最前面)。键入 P 按 CPU 使用率对任务进行排序。键入 M 按内存使用率对任务进行排序。键入 k 杀死进程(提示输入 pid)。
ps 程序会显示所有正在运行的进程及其 PID 号码。一旦知道 PID,就可以向进程发送信号。SIGSTOP 停止进程。SIGCONT 继续已停止的进程。SIGKILL 杀死进程。
用于向进程发送信号的程序称为 kill。
kill -SIGKILL [pid] kill -63 [pid] kill -l
默认情况下,进程在前景启动,并且它是唯一接收键盘输入的进程。使用 CTRL+Z 暂停它。
要在后台启动进程,请使用 &。
bash & xeyes &
作业控制
在 bash 进程中,可以启动多个作业。用于操作作业的命令是
jobs # List all the active jobs bg %job # Resume job in background fg %job # Resume job in foreground kill %job # Kill background job
当 bash 终止时,从该会话启动的所有进程都将收到 SIGHUP 信号。默认情况下,这将终止进程。
要防止进程终止,可以使用 nohup 命令启动程序。
nohup mydaemon
- 练习结果.
描述:考生应该能够管理进程执行优先级。任务包括以较高或较低优先级运行程序,确定进程的优先级以及更改正在运行进程的优先级。
关键文件术语和实用程序包括
nice
ps
renice
top
要以调整后的优先级启动命令,请使用 nice。
nice -n +2 [command]
nice -n -19 [command]
nice 程序更改调度器的基本时间量子。
即它告知调度器进程的重要性,这被用作调度器分配多少 CPU 时间的参考。
例如,如果您想在刻录另一张 CD 时听音乐,您可以使用 nice -n +5 oggenc,您不应在音乐回放中遇到任何“跳跃”,因为调度器“知道”oggenc 进程不太重要。
该值可以从 -19(最高优先级)到 +20(最低优先级)。
默认值为 0。只有 root 可以设置低于零的值。
要修改正在运行的程序的优先级,请使用 renice。
renice +1 -u root
# 更改所有 root 进程的优先级。
renice +2 -p 193
# 更改 PID 为 193 的进程的优先级
- 哪些用户和 root 进程使用最多的内存?
- 打开两个终端。在一个终端中键入以下内容
while [ 1 ] do echo -n The date is:; date; done
从另一个终端中看到您可以停止和继续打印输出。
3) 与 2) 相同的开始,但让打印输出每隔 3 秒停止 1 秒继续重复进行。 4) 创建一个 shell 脚本,将所有名为 apache 的进程的优先级调整为 19。 5) 从 ps 打印格式为:“用户名”,“命令”,“优先级” 6) 杀死所有名为“bash”且由用户 polto 拥有的进程。
描述:考生应该能够使用正则表达式操作文件和文本数据。本目标包括创建包含多个符号元素的简单正则表达式。它还包括使用正则表达式工具在文件系统或文件内容中执行搜索。
关键文件术语和实用程序包括
grep
regexp
sed
有两种模式匹配
- 通配符(文件名生成)
- Regexp(正则表达式)
通配符主要应用于在当前目录或子目录中使用时。当通配符 *, ?, [ - ], ~, 和 ! 在 regexp 中使用时,它们不再生成文件名。
使用 regexp 的一些实用程序是
- grep, egrep
- vi
- more
- sed
- Perl
有限的 regexp 搜索模式 所有使用 regexp 的实用程序都使用它。
- 任何 1 个字符 . Ab.a Abla 或 Abca
- 1 个字符集 [ ] Ab[sd]a Absa 或 Abda 仅此而已
- 1 个字符范围 [ - ] Ab[a-z]a Abaa 或 Abba 或 ...
- 不在集合中 [^ ] Ab[^0-9]a Abaa 或 Abba 或 ...
- 0 个或多个 * Ab*a Absala 或 Aba 或 ...
- 行开头 ^ ^Aba 行开头 > Aba
- 行结尾 $ Aba$ Aba < 行结尾
- 字面值 \ Aba\$ Aba$
示例
Ab[0-3]s ^Ab\^bA [01]bin$ ^..\\ [^zZ]oro
有限 regexp 的组合 所有使用 regexp 的实用程序都使用的组合。
- 任何字符串 .* Ab.*a Abrahma 或 Abaa 或 ...
- 从 [ ]* th[aersti]* 开始的字符串 There 或 This 或 ...
- 多范围 [ - - ] Ab[0-2][a-c]a Ab0aa 或 Ab1aa 或 ...
- 匹配 \ \\ \\[a-zA-Z]* \Bethoven
示例
Ab[0-3][a-z]s ...$ ^[01]\^2 [0-9][a-z] \$ [a-zA-Z]* ^[^c-zC-Z]* ^[a-zA-Z0-9]$
修饰符模式 替换与 regexp 模式匹配的字符串
- 匹配 m \{m\} b[0-9]\{3\} b911
- 一个或多个 \{m,\} b[0-9]\{2,\} b52
- 最多 n \{m,n\} b[0-9]\{2,4\} b1234
- 单词开头 \< \<wh where
- 单词结尾 \> [0-9]\> bin01
要查找文件中的文本,请使用 grep。
grep [options] [string] [files]
最好引用字符串以防止解释。
常用选项:-i:忽略大小写 -l:仅列出文件名,如果至少有一个匹配 -c:仅显示匹配行的数量 -n:也显示行号 -v:不能匹配。
示例
grep host /etc/*.conf grep -l '\<mai' /usr/include/*.h grep -n toto /etc/group grep -vc root /etc/passwd grep '^user' /etc/passwd grep '[rR].*' /etc/passwd grep '\<[rR].*' /etc/passwd
要对流应用命令,请使用 sed。
sed [address1][,address2][!]command[options] [files...]
sed 程序将在文件中的地址 1 到地址 2 之间应用命令。地址 1 和地址 2 格式是正则表达式。sed 程序是非交互式编辑工具。
示例
sed '1,3s/aa/bb/g' file # Replace in file from line 1 to 3 aa by bb. sed '/here/,$d' file # Delete line from here to the end. sed '/here/d' file # Delete lines with word here. sed '1,/xxx/p' file # Print lines from 1 to xxx. sed '/ll/,/ff/!s/maison/house/g' file # In file replace words maison by house excluding lines from ll to ff.
- 处理您的 bookmarks.html 文件以生成一个只包含网站标题的列表,并将列表写入名为 mywebsites.txt 的文件。
- 将 /etc 中的所有文件复制到您的 home 目录中的 etc/。通过将单词 host 替换为 machine 来显示所有 *.conf 文件的内容。
- 显示所有不包含 root 词语的 *.conf 文件的内容。使用 grep 和 sed 的命令是什么?
- 打印 root 所属的所有组名。
- 列出所有长度为 4 或 5 个字符的组名。
- 列出所有包含不含空格(空白)的字符行的文件。
- 列出 etc/ 目录中所有包含数字字符的文件。
- 使用 ls 仅打印 / 中的目录名。
- 执行“ps -aux”并将用户 r_polto 替换为 root,并将结果打印到名为 new_process.txt 的文件中。
- 列出所有名为 apache 且由以“p”或“P”开头的用户名拥有的进程。
描述:考生应该能够使用 vi 编辑文本文件。本目标包括 vi 导航、基本 vi 节点、插入、编辑、删除、复制和查找文本。
关键文件术语和实用程序包括
vi
/, ?
h,j,k,l
G, H, L
i, c, d, dd, p, o, a
ZZ, :w!, :q!, :e!
:!
在使用 X-Windows 时,您可以使用鼠标导向的编辑器,例如 xedit。在交叉开发环境中,用户可以使用自己喜欢的编辑器。在非窗口系统上,您只需要一个键盘编辑器,例如 vi。Linux 上的 vi 编辑器与任何 Unix 系统上的 vi 编辑器相同。vi 有两种模式。
- 命令模式:您输入的任何内容都将被解释为命令
- 输入模式:您输入的任何内容都将插入到文件中
从一种模式切换到另一种模式 命令模式到输入模式:i、I、a、A、o、O 键 输入模式到命令模式:ESC 键 默认的起始模式是命令模式 可以在您的 HOME 目录中创建文件配置 .exrc 来设置一些 vi 的行为。
set ignorecase # No case-sensitive set tabs=3 # 3 space for tab character
使用 vi 执行基本文件编辑
进入输入模式
- i 在光标前
- I 在行首
- a 在光标后
- A 在行尾
- o 在下方打开一行
- O 在上方打开一行
删除
- dw 删除单词
- dd 删除行
- D 删除到行尾
- x 删除光标处的字符
移动光标
- l 右移一个空格
- h 左移一个空格
- j 下移一行
- k 上移一行
- $ 行尾
- ^ 行首
- w 下一个单词
- e 单词结尾
练习
[edit | edit source]- 使用vi从任何目录开始编辑一个空的缓冲区。
- 在这个缓冲区中输入几行文本。
- 将缓冲区的内容保存到目录中。
- 使用vi.
- 再次打开文件。创建新的一行在您之前输入的内容下方。(不要使用i从命令模式!)
- 退出vi不保存这些更改。