第十章 VI文字处理
vi 常用命令:
!command 暂进离开VI 执行command命令。 !ls /dev
:w filename 将文件另存为filename
:e 恢复文件到状态
ctrl+r 重复上个动作
. 重复上个操作 如删除、粘贴
vim 常用命令
块选择 v,V,ctrl+v 块复制/删除 y,d
多功能窗口 :sp filename 窗口切换: ctrl+wj ctrl+wjk
常用设置参数 set nu, set hlsearch, set ruler, set all
配置文件: /etc/vimrc (全局的) ~/.vimrc 当前用户的
DOS与Linux换行符
Linux中的换行符为LF($) DOS中的换行符为CRLF(^M$)
可以通过dos2unix和unix2dos 命令使两种格式互转给每一行开头加入字母Y :1,s/^/Y/g
第十一章 认识Bash Shell
Shell
查看当前文件系统中有哪些shell可用 cat /etc/shells
~/.bash_history 中记录的是前一次登录之前所用过的shell命令。而至于这一次登录所执行的命令都被暂存在临时内存中
成功注销后那些命令才会记录到bash_history中。
type
用于判断一个命令是内部命令还是外部命令。 type -a ls
Shell中的变量
显示变量的内容 echo $varaible echo ${varaible}
单引号和双引号的区别
双引号中的特殊字符可以保持变量特性,单引号只是将它看做一般字符
word=abc wordA="$word d" wordB='$word d'
echo $wordA 结果: abc d
echo $wordB 结果: $word d
`符号用于获取其它命令提供的信息 如: cd /lib/modules/`uname -r'/kernel
取消变量的方法 unset 变量名称
\ 是转义字符 它可将特殊符号转义为一般字符 如 ' 空格Enter $ `等
shell中命令的执行都是通过子程序来完成的。 父程序中的自定义变量无法在子程序中使用,除非通过export将自定义变量转变成环境变量。
环境变量
env仅显示环境变量
set显示环境变量及用户自定义的变量
export 将自定义变量 变成环境变量。 父进程的自定义变量在子进程中无效 只有将其变成环境变量 子进程才能访问。
declare/read/数组
read通过用户的输入设置变量的值。p=prompt t=time
read -p "input name:" -t 30 GuestName
declare 声明变量
变量默认的类型是字符型 decalre -i 设置变量为整型 decalre -i sum=100+100 ; echo $sum;结果为200
数组
var[1]="abc" var[2]="def"
ulimit -a 显示用户所受的限制:可用的最大进程数量、可锁定的内存量、可用的管理处理数量等
附加的变量设置功能
# ## % %%
echo ${HOME##/*/}; expr="abc"; var=${str-expr}
alias/unalias
history命令
!! 执行上一个命令
!number 执行第number个命令
!cmd 执行最近的今有cmd命令的命令
Bash shell使用环境
不要将当前路径. 放在PATH中。这样做是不安全的。假/tmp目录有个恶意程序 名字为ls
那么当在tmp中执行ls时 恶意程序ls 就会被执行 而不是/bin/ls
登录消息显示数据
/etc/issue 用户登录时显示的信息
/etc/issue.net telent登录时显示的信息环境设置文件:全局的profile和用户个性化的profile
全局 profile bashrc
/etc/bashrc /etc/profile 设置总体的一信息如umask值,PATH,它会影响到所有的用户。
个性化profile bashrc bash_logout
~/.bash_profile, ~/.bash_login, ~/.profile 在文件中定义个性化的PATH与环境变量
这三个文件通常只要一个即可 之所以有三个是历史遗留问题。执行顺序 .bash_profile-->.bash_login-->.profile
~/.bashrc 个性化的设置,如设置alias PATH等
~/.bash_logout 用户在注销后需要执行的一些命令 如 sync
执行顺序
用户在登录时先执行/etc/profile及/etc/profile.d中的文件
然后再执行~/.bash_profile或~/.bash_login或~/.profile
登录shell与非登录shell
登录shell是指用户登录linux时所获得的shell 在此之后所获得的shell叫非登录shell.
如:在我们登录Linux X Widnow时输入用户名和密码后 登录成功就获得了登录shell,
之后当我们用x-term打开终端时所用的都是非登录shell.
也可以理解成登录成功并获取登录shell后,又新打开的shell。
区别:
登录shell会读取~/.bash_profile或 ~/.bash_login或 ~/.profile
非登录shell只读取 .bashrc文件
简单的理解为 在用户登录时profile文件只读取一次,而每当用户打开新的shell时都会读取bashrc文件。
终端环境的设置
stty -a 显示所有按键内容 如 intr(中断)=^c
stty intr ^b 把中断命令由ctrl+c 改成 ctrl+b
set -x 显示执行的shell命令
数据流重定向
标准输入0 标准输出1 标准错误输出 2
> 1> 2> 2>> 重定向输出或错误到一个文件或设备 find / name testing > output.txt 2>error.txt
< 重定向输入到一个文件或设备 cat < abc.txt
<< abc 以abc做为标准输入的结束符 当输入遇到abc时终止读取 cat > output << abc
2>&1 将标准错误和标准输出重定向到同一个文件 find / name testing 2>&1 output.txt
/dev/null 垃圾箱 可以将不需要的输出重定向到这个设备中
find / name testing > output.txt 2> /dev/null
命令执行的判断根据 && ||
&& 当前一个命令执行成功后才执行下一个命令 || 恰与之相反
如:判断一个根目是否存在 如存在则显示 exist 否则显示 not exist
ls /dev/ma && echo "exist" || echo "Not exist"
管道命令
cut 对文件中每一行里的数据进行分解,主要用于log文件分析
cut -d 'delimiter' -f number
-d 分隔符 只可为一个字符
-f 根所分隔符将消息分成几段, 用-f 取出第几段的意思。
echo $PATH | cut -d ':' -f 1,3
grep 搜索字符串
grep [-acinv] '搜索字符串' filename
-n 显示行号
-v 显示没有找到搜索字符的行的内容
sort 排序
sort [-fbMnrtuk] [file or stdin]
-f 忽略大小写差异
-b 忽略最前面的空格
-u uniq 相同的数据中仅出现一行表示
-t 分隔符 常与-k一起使用
-k 以分隔符将数据分解行 以哪段来进行排序
cat /etc/passwd | cut -d ":" -f 3 | sort -n
uniq 若数据已排序,将重复的数据仅显示一次
uniq [-ic]
-c 进行计数
last | cut -d " " -f 1 | sort | uniq -c
wc 对文件的字符进行统计
wc [-lwm]
-l 多少行
-w 多少单词
-m 多少字符
last | wc -m
tee 双重定向 将输入写到文件和输出
tee [-a] -a 代表累加
export | tee tmp | cut -d "=" -f 1
字符转换命令 tr col join paste expand
tr 删除一段消息中的文字或进行文字替换
tr [-d] 字符 ...
-d 删除指定的字符
last | tr "[a-z]" "[A-Z]"
cat /etc/passwd | tr -d ":"
cat ~/dosfile | tr -d "\-r" #same as dos2unix
xargs
可以读入标准输入的数据,并且以空格符或换行符作为标识,将stdin的数据分隔成为参数。
因为以空格作为分隔,所以一些文件名含有空格时,xargs就会误判
xargs -[0epn] command
0: 若输入的stdin含有特殊字符如, \ 则将其变成一般字符
e: EOF(end of file),后面紧跟一个字符串,当xargs 分析到这个字符串时就会停止工作
p: 在执行每个命令的参数都询问用户
n: 接次数 当执行command时要使用几个参数。
cat /etc/passwd | cut -d ":" -f1 |head 10 | xargs finger
cat /etc/passwd | cut -d ":" -f1 |head 10 | xargs -n 5 finger
cat /etc/passwd | cut -d ":" -f1 |head 10 | xargs -e"lp" finger
-减号的用途
在管线命令当中,常常会使用到前一个指令的 stdout 作为这次的 stdin , 某些指令需要用到档案名称 (例如 tar) 来进行处理时,
该 stdin 与 stdout 可以利用减号 "-" 来替代
举例来说: [root@linux ~]# tar -cvf - /home | tar -xvf -
上面这个例子是说:‘我将 /home 里面的档案给他打包,但打包的资料不是纪录到档案,
而是传送到 stdout; 经过管线后,将 tar -cvf - /home 传送给后面的 tar -xvf - ’。后面的这个 - 则是
取用前一个指令的 stdout, 因此,我们就不需要使用 file 了!
第十二章 正则表达式
[] 来搜索集合字符
[]中不论有几个字符 都只代表某“一个”字符 如:[abc]a 代表 aa ba ca
[A-Z]代表从A到Z的所有大写字母 [A-Z0-9]代表所有大定字母和数字 注:中间无空格
如:grep -n [A-Z0-9] reg.txt 选出有大写字母或数字的行
[^] 来搜索不含有某字符的行
如:grep -n [^0-9] reg.txt 选出不含有数字的行
^ $ 行首与行尾字符
字符^在[]内代表反选,否则代表行首 如:^[abc] 以a或b或c开头的行
字符$代表行尾 如: km$ 代表以km结尾的行
^$代表空白行 即没有任何字符的行如: grep -v ^$ reg.txt | grep ^# 删除文件中的空白行或注释的行 -v 代表反选
等价于 egrep "^$|^#" reg.txt
任意字符. 与重复字符* 它与通配符中的*完全不同字符. 代表“绝对有一个字符” 如:g.d 可以代表god字符* 代表重复0个或任意多个前面的字符 如:g*d 代表 d前面有0个或多个g的字符串 d gd ggggd 但gad就不符合要求,因为a不是g的重复g.*d 代表所有以g开头以d结尾的字符串 可以代表gxxxxd gdg*d 代表含有d或开头有g的字符串 g.*d代表以g开头以d结尾的字符注意 d*g 与g.*d的区别 dg* 代表 d后面有0个或多个g的字符串 dg dgg dgggg 但dga就不符合要求。
{}限定重复字符范围
因为{为特殊字符 所以它必须加\
如:o\{2\} 代表oo o\{2,5\} 代表2到五个o oo ooo oooo ooooo
o\{2,\} 代表两个o以上的重复字符
正则表达式与通配符的不同
正则 .代表单个字符 *代表0-n个重复字符 以a开头的文件 ls | grep ^a.*通配符 ?代表单个字符 *代表任意字符组合 以a开头的文件 ls a*
扩展正则表达式
命令egrep 是grep -E的别名 它支持扩展正则表达式
+ 代表重复一个或以上前面的字符 g+d : ggd gggggd
? 代表0或一个字符 g?d : gd gxd
| 同时搜索多个字符 go|come : go 或 come
() 同时搜索多种组合字符 g(xy)o : gxo gyo
echo "AxyxyxyM" | egrep "A(xy)+M"
printf 格式输出
printff "打印格式" 实际内容sed/AWK工具简介
diff与cmp不同: diff是以“行”为单位进行比较的,cmp是以位为单位进行比较的。使用grep或其他工具进行正则表达式的字符串比较时,因为编码问题会有不同的状态, 因此,最好将LANG及LANGUAGE等变量设置为C或en等英文语系

浙公网安备 33010602011771号