【读书笔记】《Linux 命令、编辑器与shell编程》
时间:2008-01-24 来源:sealearner
Linux 命令、编辑器与shell编程》(美)Mark G.Sobell 著 杨明军 王凤芹 译 清华大学出版社
2007-12-24
终端处理字符:
ctrl+z 挂起,可用fg切换到前台,jobs 查看后台任务情况;
ctrl+w 删除单词;
ctrl+u 删除行 ctrl+x好像没有效果;
定位工具:
which 只在设定的路径搜索,只报告第一个找到的;
whereis 在标准路径,显示所有的;
type 确定文件是否为内置命令;
apropos 关键字
whatis 完全匹配关键字;
符号链接:
内置命令pwd显示链接名;
工具(/bin/pwd)显示路径;
info bash builtin 列出内置命令;
2007-12-25
vim的使用:
ctrl+w 删除单词;
ctrl+h 删除行 ctrl+u;
:redo ctrl+r 撤销;
ctrl+l 刷新;
vim -r 检查交换文件;
命令模式移动光标
字符移动 空格 h和l;Ff
字移动 Ww W按空白分隔字符
行移动 j k
句子 ()
段 {}
屏幕 H M L
删除
dG 删除到末尾;
d1G 从开始删除;
d0 从行的开始;
~ 修改大小写;
替换
1,。 开始到当行;
。,$ 当前到末尾;
1,$ 或 % 所有;
:1,$s/ten/te/g 所有行的所有ten替换成te;
2008-01-05
数组变量:
赋值
NAMES=(max helen sam zach)
NAMES[1]=fly
引用值
#echo ${NAMES[2]}
sam
——————————————————————————————
下标[*]和[@]的区别:
作用都是提取整个数组,但是加双引号工作机制却不同:
@将原来的数组复制到新的数组,新旧一样,相当于复制;
*将原来的数组当一个元素复制到新的数组
例:
A=("${NAMES[*]}")
B=("${NAMES[@]}")
用declare -a 显示数组内容
[root@Test ~]# declare -a
declare -a NAMES='([0]="max" [1]="helen" [2]="sam" [3]="zach")'
declare -a A='([0]="max helen sam zach")'
declare -a B='([0]="max" [1]="helen" [2]="sam" [3]="zach")' echo ${#NAMES[*]} 元素的个数
[root@Test ~]# echo ${#NAMES[*]}
4 echo ${#NAMES[0]} 元素的长度 [root@Test ~]# echo ${#NAMES[0]}
3 ————————————————————————————————— ((count=count-1))双扣号,保证shell看成算术表达式,变量不用$ $$ 进程ID,方便创建唯一的文件名; $0 命令本身; $! 后台进程PID; $?退出状态; $# 除命令本身外的参数个数; $*和$&的区别: $* 将所有参数当成一个整体(一个参数); $@ 和原来的一样; 跟下标[*] [@]一样 —————————————————————————————————— shift左移命令 为了得到任意一个参数,循环扫描命令行; set 初始命令行参数值; set $(date) set date ——————————————————————————————————— :- 使用默认值 ${name:-default} := 赋默认值 ${name:=default} : 内置命令 赋值并不执行 : ${name:=default} :? 显示错误信息,并返回状态1,shell不退出;${name:?message} ———————————————————————————————————— 路径操作符 # 最小去除前缀; ## 最大去除前缀; % 最小去除前缀; %% 最大去除前缀; 例: [root@Test ~]# test=/usr/local/src/proftpd-1.2.10.tar.gz [root@Test ~]# echo ${test}
/usr/local/src/proftpd-1.2.10.tar.gz
[root@Test ~]# echo ${test#/*}
usr/local/src/proftpd-1.2.10.tar.gz
[root@Test ~]# echo ${test##/*} [root@Test ~]# echo ${test%/*}
/usr/local/src
[root@Test ~]# echo ${test%%/*}
[root@Test ~]# echo ${#test} 显示字符个数
36 ————————————————————————————————————— sed的使用: 参数: -n 显示除了p指令; -i 将修改保存到文件; 指令: d 删除,整行删除; n 显示选中的行当前,从输入中读入下一行; a 每一行之后追加文件,以\换行; i 行之前追加; c 替换文件(整行); s 替换地址; w 重定向到新文件; r 追加行之后; q 退出; 控制结构: !NOT $!d 除了末行之外; {} 指令组;为分隔 Pattern区和Hold区: Pattern:工作平台(保存刚读入的行); Hold:临时工作区 H P->H 将一个换行符和内容追加到H h P->H 将P区替换掉H G H->P 将一个换行符和内容追加到G g H->P 将H区替换掉P 例: sed '5 q' filename 显示前5行; sed '2 a test' filename 第2行之后插入一个换行符和test; sed '/the/n;p' file 所有匹配the不显示; sed 's/^. /\t&/' filename 行首不是空格插入制表符; (^. ) 行首不是空格; s/^/\t/ 行首插入制表符; s/ *$// 行尾的空格全部删除; sed 'G' filename 每行之后插入一个空行; 倒序: 2,$ G h $! G —————————————————————————————— cat -A(-vET) -b 对非空行进行编号; -n 对所有行进行编号; -s 去除多余的空白行; cut -c -d 分隔符; -f 例: [root@Test sh]# ll |tr -s ' ' ' '|cut -f 5,9 -d ' ' 2.3K a
2.2K b
4.0K BK/
436 ip.1
452 ip.2
264 ip.a
85K ip.list
22K ipList.temp
486 sample.sh*
9.9K selectInfo.sh*
4.0K temp/ tr -s 将多个空格化成单个空格; [root@Test 20080114]# grep -n '^' test
1:a
2:b
3:c
4:d '^' 匹配所有的行; -n 对所有的行进行编号 [root@Test 20080114]# grep -h a * |sort|uniq -c
2 a -h 不显示文件名; uniq -c 对于重复的行只显示一遍,并对重复的次数进行统计; [root@Test 20080114]# vi $(grep -l 'a' *)
2 files to edit 编辑多个匹配的文件; -l 匹配的文件名; #kill -9 0 对于普通用户来说相当于注销; 对于root等于关机,请慎用; ———————————————————————————————— ls的参数: -A 显示除了.. . 两个外的所有文件; -F 显示文件特征; -r 逆顺; -t 按修改时间; -x 行显示; -1 一行显示一个文件; ———————————————————————————————— sort 参数: -b 排除字段之前的空格和TAB; -f 将小写看成大写(大写在前); -n 算术排序,负号和小数点有意义; -r 逆顺; -t x 分隔符x; -u 重复的行只显示一次; -k start[,stop] 注: 大写在小写之前; 空白符在之前; 第一遍比较无相同,不进行第二遍查询; 例: #sort --key=2 test 第2字段; #sort -k 2 -f test 第2字段,小写看成大写; #sort -k 2 -b test 第2字段,字段前面的空白符和TAB忽略; #sort -fb -k 3.4 test 第3字段的第4个字符开始; #sort -b -k 3.4 -k -2f test 第一遍:第3字段的第4字符 第二遍:第2字段,小写看成大写; #sort -k 1 -k 5 test 先第一字段(没有指定结尾,便是到结束),再第五字段; 但是如果第一遍比较没有相同,不进行第2遍比较; #sort -k 1,1 -k 5 test 先第一字段,-k 1,1(第一字段的第一字符到stop:第一字段) 再进行第五字段; #sort -u -k 1f -k 1 test 进行二遍比较,当有大小写相同的字段时; —————————————————————————————— 正则表达式: 星号: /(.*)/ 与圆括号最长匹配; /([^)]*)/ 与圆括号最短匹配; 空正则表达式: /\(test\)/ 和/test/一样; /a\(b*\)c/ 和/ab*c/一样; 替换字符串: &符号 与正则匹配的字符串匹配 \n 转义数字 例: :1,$/\([^,]*\),\(.*\)/\2 \1/ 1,$ 所有的行; \([^,]*\)和[^,]*一样,匹配除逗号外的任意字符串; \2 代表第2个括号内的正则; ———————————————————————————————— 扩展正则: + 匹配字符前面1个或多个; ?匹配字符前面0个或1个 例: /ab+c/ abc abbc /ab?c/ ac abc /(ab)+c/ abc ababc /(ab)?c/ c abc /ab|ac/ ab ac abac /^Exit|^Quit/ 以Exit 或者Quit 开头的 /(D|N)\.Jones/ D.Jones N.JOnes vim中 \|代表 | 特殊字符: . 单个字符; * 与*前面的0个或者多个字符; \< 字的开始; \> 字的末尾;
declare -a A='([0]="max helen sam zach")'
declare -a B='([0]="max" [1]="helen" [2]="sam" [3]="zach")' echo ${#NAMES[*]} 元素的个数
[root@Test ~]# echo ${#NAMES[*]}
4 echo ${#NAMES[0]} 元素的长度 [root@Test ~]# echo ${#NAMES[0]}
3 ————————————————————————————————— ((count=count-1))双扣号,保证shell看成算术表达式,变量不用$ $$ 进程ID,方便创建唯一的文件名; $0 命令本身; $! 后台进程PID; $?退出状态; $# 除命令本身外的参数个数; $*和$&的区别: $* 将所有参数当成一个整体(一个参数); $@ 和原来的一样; 跟下标[*] [@]一样 —————————————————————————————————— shift左移命令 为了得到任意一个参数,循环扫描命令行; set 初始命令行参数值; set $(date) set date ——————————————————————————————————— :- 使用默认值 ${name:-default} := 赋默认值 ${name:=default} : 内置命令 赋值并不执行 : ${name:=default} :? 显示错误信息,并返回状态1,shell不退出;${name:?message} ———————————————————————————————————— 路径操作符 # 最小去除前缀; ## 最大去除前缀; % 最小去除前缀; %% 最大去除前缀; 例: [root@Test ~]# test=/usr/local/src/proftpd-1.2.10.tar.gz [root@Test ~]# echo ${test}
/usr/local/src/proftpd-1.2.10.tar.gz
[root@Test ~]# echo ${test#/*}
usr/local/src/proftpd-1.2.10.tar.gz
[root@Test ~]# echo ${test##/*} [root@Test ~]# echo ${test%/*}
/usr/local/src
[root@Test ~]# echo ${test%%/*}
[root@Test ~]# echo ${#test} 显示字符个数
36 ————————————————————————————————————— sed的使用: 参数: -n 显示除了p指令; -i 将修改保存到文件; 指令: d 删除,整行删除; n 显示选中的行当前,从输入中读入下一行; a 每一行之后追加文件,以\换行; i 行之前追加; c 替换文件(整行); s 替换地址; w 重定向到新文件; r 追加行之后; q 退出; 控制结构: !NOT $!d 除了末行之外; {} 指令组;为分隔 Pattern区和Hold区: Pattern:工作平台(保存刚读入的行); Hold:临时工作区 H P->H 将一个换行符和内容追加到H h P->H 将P区替换掉H G H->P 将一个换行符和内容追加到G g H->P 将H区替换掉P 例: sed '5 q' filename 显示前5行; sed '2 a test' filename 第2行之后插入一个换行符和test; sed '/the/n;p' file 所有匹配the不显示; sed 's/^. /\t&/' filename 行首不是空格插入制表符; (^. ) 行首不是空格; s/^/\t/ 行首插入制表符; s/ *$// 行尾的空格全部删除; sed 'G' filename 每行之后插入一个空行; 倒序: 2,$ G h $! G —————————————————————————————— cat -A(-vET) -b 对非空行进行编号; -n 对所有行进行编号; -s 去除多余的空白行; cut -c -d 分隔符; -f 例: [root@Test sh]# ll |tr -s ' ' ' '|cut -f 5,9 -d ' ' 2.3K a
2.2K b
4.0K BK/
436 ip.1
452 ip.2
264 ip.a
85K ip.list
22K ipList.temp
486 sample.sh*
9.9K selectInfo.sh*
4.0K temp/ tr -s 将多个空格化成单个空格; [root@Test 20080114]# grep -n '^' test
1:a
2:b
3:c
4:d '^' 匹配所有的行; -n 对所有的行进行编号 [root@Test 20080114]# grep -h a * |sort|uniq -c
2 a -h 不显示文件名; uniq -c 对于重复的行只显示一遍,并对重复的次数进行统计; [root@Test 20080114]# vi $(grep -l 'a' *)
2 files to edit 编辑多个匹配的文件; -l 匹配的文件名; #kill -9 0 对于普通用户来说相当于注销; 对于root等于关机,请慎用; ———————————————————————————————— ls的参数: -A 显示除了.. . 两个外的所有文件; -F 显示文件特征; -r 逆顺; -t 按修改时间; -x 行显示; -1 一行显示一个文件; ———————————————————————————————— sort 参数: -b 排除字段之前的空格和TAB; -f 将小写看成大写(大写在前); -n 算术排序,负号和小数点有意义; -r 逆顺; -t x 分隔符x; -u 重复的行只显示一次; -k start[,stop] 注: 大写在小写之前; 空白符在之前; 第一遍比较无相同,不进行第二遍查询; 例: #sort --key=2 test 第2字段; #sort -k 2 -f test 第2字段,小写看成大写; #sort -k 2 -b test 第2字段,字段前面的空白符和TAB忽略; #sort -fb -k 3.4 test 第3字段的第4个字符开始; #sort -b -k 3.4 -k -2f test 第一遍:第3字段的第4字符 第二遍:第2字段,小写看成大写; #sort -k 1 -k 5 test 先第一字段(没有指定结尾,便是到结束),再第五字段; 但是如果第一遍比较没有相同,不进行第2遍比较; #sort -k 1,1 -k 5 test 先第一字段,-k 1,1(第一字段的第一字符到stop:第一字段) 再进行第五字段; #sort -u -k 1f -k 1 test 进行二遍比较,当有大小写相同的字段时; —————————————————————————————— 正则表达式: 星号: /(.*)/ 与圆括号最长匹配; /([^)]*)/ 与圆括号最短匹配; 空正则表达式: /\(test\)/ 和/test/一样; /a\(b*\)c/ 和/ab*c/一样; 替换字符串: &符号 与正则匹配的字符串匹配 \n 转义数字 例: :1,$/\([^,]*\),\(.*\)/\2 \1/ 1,$ 所有的行; \([^,]*\)和[^,]*一样,匹配除逗号外的任意字符串; \2 代表第2个括号内的正则; ———————————————————————————————— 扩展正则: + 匹配字符前面1个或多个; ?匹配字符前面0个或1个 例: /ab+c/ abc abbc /ab?c/ ac abc /(ab)+c/ abc ababc /(ab)?c/ c abc /ab|ac/ ab ac abac /^Exit|^Quit/ 以Exit 或者Quit 开头的 /(D|N)\.Jones/ D.Jones N.JOnes vim中 \|代表 | 特殊字符: . 单个字符; * 与*前面的0个或者多个字符; \< 字的开始; \> 字的末尾;
相关阅读 更多 +