笔记
开始使用 Linux
useradd # 添加用户,用户信息存放在 /etc/passwd
man # 查看手册,章节编号 1命令 2系统调用 3库函数 5配置文件
man [name]
man [section name]
man -k [regexp] # 列出关键字与正则表达式匹配的手册目录
date # 可定制输出格式
ntpdate [ntp webiste link] # 通过 ntp 协议校对系统时间
cal # 日历
cal [year]
cal [month] [year]
bc # 计算器
passwd # 修改用户名称
passwd [user name] # 系统以 hash 值的方式存储口令信息
who # 确定谁在系统中
tty # 打印出当前终端的设备文件名
who am i
whoami
uptime # 了解系统启动时间和忙碌程度
# 后面三个值分别是 1,5,15 分钟内的 CPU 负载
top # 列出资源占用排名靠前的进程
ps -e # 列出所有进程
ps -f # 以 full 的格式列出
ps -l # 以 long 的格式列出
free # 了解内存使用情况
###
# 注意:free 后结果中的 available = free + buffer + cache (应用程序认为可用的内存空间)free 则是尚未被使用的内存空间
###
vmstat # 了解系统负载情况
文本文件的处理
Linux 中的文本信息
-
文本文件
-
程序输出
-
系统配置信息
- /etc 下的配置文件 (功能类似 windows 的注册表)
-
文本型网络协议
- 因特网大部分传输层以上的协议是文本协议
- 会话层协议:HTTP,POP3,SMTP,IMAP
- 表示层协议:HTML,XML,MIME
-
文本文件处理的命令 (脚本)
进程的标准输入输出
- 进程的基本概念
- 进程的输入输出
- 重定向机智
- 输出
ls -l > filelist.txt
- 输入
sort < filelist.txt
- 输出
- 管道机制
ls -l | sort
- 重定向机智和管道机制的重要性
- 特点
- 不指定处理对象文件名时,从标准输入获得数据
- 指定处理对象文件名时,从文件中获取数据
- 多数命令可以指定多个文件
- 处理结果在标准输出显示
- 考虑的因素
- 标准输入 / 标准输出
- shell 的文件通配符
- 输入输出重定向
- 管道
- 灵活性:工具命令的组合
- Linux 倾向于提供独立的多个精巧的工具命令,数据格式为文本信息
- 鼓励使用重定向或管道机制将多个工具命令组合到一起,提供灵活的功能
- 应用系统设计时,也应该考虑到这些特点
- 例如:数据库内容的展示,直接输出多列文本,考虑到各种工具软件的使用
读取文件内容
more / less # 逐屏显示文件
more [文件名]
more *.[ch] # 指定多个文件
ls -l | more # 指定 0 个文件
cat / od # 列出文件内容
od # octal dump 逐字节打印
head / tail # 显示文件头部或者尾部
head -n [行数]
tail -f [文件名] # 实时打印文件尾部被追加的内容 (-f: forever)
tee # 三通
./myap | tee myap.log # 将从标准输入 stdin 得到的数据抄送到标准输出 stdout 显示,同时存入磁盘文件中
wc # 字计数 列出多少行,多少单词,多少字符 # 可以指定多个文件 -l 只列出行计数
sort # 对文件内容排序 sort -n
sort telno > telno1
ls -s | sort | tail -10
ls -s | sort -n | tail -10
tr # 翻译字符
tr string1 string2 # 把标准输入拷贝的标准输出,把所有 string1 替换成 string2
cat report | tr '[a-z]' '[A-Z]'
uniq # 筛选文件中的重复行
正则表达式
-
正则表达式的功能
- 描述一个字符串模式
-
注意
- 正则表达式规则与文件名通配符规则不同
- 正则表达式规则用于文本处理的场合
- 文件名通配符规则用于文件处理的场合
- 不同软件对正则表达式的定义会有差异
- 正则表达式规则与文件名通配符规则不同
-
6 个元字符
. * [ \ ^ $
-
其他字符与其自身匹配
-
转义
- 用反斜线可以取消特殊字符的特殊含义
- 如:正则表达式 end\. 只与字符串 end. 匹配
-
长的正则表达式是由单字符正则表达式构成的
-
非特殊字符与其自身匹配
- 如:正则表达式 a 与字符串 a 匹配,b 与 b,/ 与 /
-
转义字符 (\)
-
\. \* \$ \^ \[ \\
正则表达式 \* 与字符串 * 匹配,与字符串 \* 不匹配
转义字符后除以上六种字符之外的不该出现其他字符,例如:不该出现 \u ,这样的组合被视为 undefined (未定义的),后出的软件有可能会有特殊的解释
-
-
圆点 ( . )
- 匹配任意字符
-
基本用法
- 在一堆方括号之间的字符为集合的内容
- 如:单字符正则表达式 [abcd] 与 a 或 b,c,d 匹配
- 圆点,星号,反斜线在方括号内时,代表他们自己
- 如:[\*.] 可匹配 3 个单字符
- 在一堆方括号之间的字符为集合的内容
-
用减号 - 定义一个区间
- 如 [a-d] [A-Z] [a-zA-Z0-9]
- [ ][ ] 集合含左右中括号两个字符
- 减号在最后,则失去表示区间的意义
- [ad-] 只与 3 个字符匹配
-
用 ^ 表示补集
- ^ 在开头,则表示与集合内字符之外的任意字符匹配
- 如:[^a-z ] 匹配任一非小写字母
- [^][ ] 匹配任一非中括号字符
- ^ 不在开头,则失去其表示补集的意义
- 如:[a-z^] 能匹配 27 个单字符
- ^ 在开头,则表示与集合内字符之外的任意字符匹配
组合和锚点
-
串结
- 如 abc, [A-Z].[0-9]. 匹配 4 个字符,注意 . 可以匹配任意字符
-
星号 (*)
-
单字符正则表达式后跟 * ,匹配此单字符表达式的 0 次或 任意多次出现
-
如: 12*4 可以匹配 122222224, 14, 1224
-
如:[A-Z][0-9]* 可以匹配 :
[A-Z], [A-Z][0-9], [A-Z][0-9][0-9], [A-Z]及若干个[0-9]
-
-
-
$ 在尾部时有特殊意义,否则与其自身匹配
- 如: 123$ 匹配文件中尾行的 123,不在尾行的 123 字符不匹配
- 如:$123 匹配 $123
- 如:.$ 匹配尾行的任意字符
-
^ 在首部时有特殊意义,否则与其自身匹配
-
^printf 匹配行首的 printf 字符串,不在行首的 printf 串不匹配
-
Hel^lo 匹配 Hel^lo
-
在 vi 中使用:10, 50s/^ //g
删除 10-50 行的每行行首的 4 个空格
-
ERE: 扩展的正则表达式(ERE)
PCRE:Perl-compatible regular expression
对基本的正则表达式(BRE)进行了改进
这里不赘述
行筛选 grep
grep / egrep / fgrep: 在文件中查找字符串(筛选)
-
语法
grep 模式 文件名列表
-
举例
- grep O_RDWR *.h
- ps -ef | grep liang
- ls -l / | grep ‘^d’ | wc -l
- grep ‘[0-9]*’ shudu.c
- grep ‘[0-9][0-9]*’ shudu.c
-
egrep 使用扩展正则表达式 ERE 描述模式
- 在指定模式方面比 grep 更灵活
-
fgrep 快速搜索指定字符串
- 按字符串搜索而不是按模式搜索
-
grep 选项
- -F, --fixed-strings
- -G, --basic-regexp
- -E, --extended-regexp
- -P, --perl-regexp
查 PCRE 语法:man pcresyntax
-
选项
- -n 显示时每行前面显示行号
- -v 显示所有不包含模式的行
- -i 字母比较时忽略字母的大小写
-
例: grep -n main *.c
- 查找含有表达式 main 的行,并打印行号
- 当文件数超过一个时,除了输出行号,还输出文件名
-
例:grep -v ‘[Dd]isable’ dev.stat > dev.active
- 取消文件中所含有指定模式的行,生成新文件
-
例:grep -i richard telnos
- 在文件中检索字符串 richard,忽略字母的大小写
sed:流编辑(加工)
- 用法
- sed ‘命令’ 文件名列表
- sed -e ‘命令1’ -e ‘命令2’ -e ‘命令3’ 文件名列表
- sed -f 命令文件 文件名列表
暂时记到这里了,sed 和 awk 命令都比较复杂下次再看。
awk:逐行扫描进行文本处理的一门语言(筛选与加工)
OK. Let’s continue. 9.08 update.
awk:逐行扫描进行文本处理的一门语言(筛选与加工)
-
用法
-
awk ‘程序’ 文件名列表
-
awk -f 程序文件名 文件名列表
程序 条件 {动作}
awk 自动对每行文本执行条件判断,满足条件执行动作 (内置循环)
允许多段程序:多段程序间用空格或分号隔开
-
-
处理方式
-
输入文件的每行作为一个“记录”,变量 NR 就是行号
-
每行用空格分隔开的部分,叫做记录的“域”
内置变量 $1 是第一域的内容,依次,$2 是第二域内容,…
特别的,$0 指的是整个这一行的内容
-
awk 的处理为:符合条件的行,执行相应的动作
-
-
使用与 C 语言类似的关系运算符
< 小于 <= 小于或等于 == 等于
!= 不等于 > 大于 >= 大于或等于
-
使用 C 语言类似的逻辑运算符
|| 或 && 与 !非
-
正则表达式的模式匹配 /regexpr/
- 包含该模式的行,执行动作
-
特殊的条件
- 不指定任何条件,对所有文本行执行动作
- BEGIN 开始处理所有文本行之前执行动作
- END 处理完所有文本行之后执行动作
-
描述“动作”时,简单的用法有:
-
自定义变量
-
加减乘除等算术逻辑运算
-
正则表达式匹配运算符(用作条件判断)~ !~
例如:$2 ~ “[1-9][0-9]*”
-
流程控制(与 C 语言类似)
- 条件判断 if
- 循环控制 for
-
print 变量1, 变量2, …
printf(“格式串”,变量1,变量2,…)
-