《快乐的linux命令行》学习笔记
1.linux 目录形式
\ (根目录)
-boot
-bin
-usr
-...
-home
- xiaoming
- xiaowang
- ...
- xiaocao
-Proj
-...
-daydayup
上一级 称之为 "父目录" , 下一级 称之为 ”子目录“. (路径名字,其实大小写是敏感的,因此不推荐重名)
相对路径表示:"." 和 ".." : 其中 "."表示目前路径; ".."表示上一级目录
cd 命令:既可以用绝对路径(始于根\),也可以用 相对路径". .."
特殊的 "cd" 进入自己的home
"cd -" 进入刚才的工作路径,即上一次的
"cd ~xiaoming" 进入xiaoming的home。
2.机器man 用不了,一般是没有manpage.可以用 ls --help.来替代查询。
3.mv dir 操作时,不需要加 递归-r
1. ls -lh 参数h配合l,将文件大小以 K、M、G的形式显示。更加直观
ls -l命令显示结果
total 1.4M
drwxr-xr-x 6 caokang caokang 4.0K Apr 2 13:19 admin
-rw-rw-r-- 1 caokang caokang 1.3M Apr 2 13:21 install.log
第一个字符"d"表示是 一个路径 ; "-"表示是一个文件。它没有子路径了。
第一个caokang表示 文件所有者。 其权限是rwx 第二个caokang表示 小组名。其权限是r-x. 最后的r-x表示其他人的权限。即:从左到又,也对应其权限。
再往又,就是文件大小,已经文件夹名\或者文件名称.
<第五章: 操作文件和目录>
1. mkdir directionary ...
语法是创建一个目录.名字为 "directionary".其尾缀 三个点,表示,"directionary".是可以重复的.
即 mkdir dir1 dir2 dir3 等于创建三个路径.
2. man cp 发现其语法介绍
Copy SOURCE to DEST or multiple SOURECE(s) to DIRECTORY
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
SOURCE也尾缀三个点,即可以 把多个文件 拷贝到 某一路径下面。(注意 DIRECTORY 和DEST的区别)
举例: cp file1 file2 把file1 拷贝成file2. 这样,每次重复copy都会直接覆盖file2.
cp -i file1 file2 覆盖前会询问下.
-r 为递归copy,常用.
-u 为 升级补漏.
2 mv 操作
mv 跟cp很相似,但是 mv是剪切.
mv file1 file2 相当于剪切flie1 ,贴到file2.在一个路径下,就相当于 renameq
mv dir1 dir2 剪切路径,注意这个时候不需要加 -r选项.跟cp有些区别
3 rm操作
linux下,有事就找男人(man)帮忙
rm [OPTION] ... FILE...
rm 常用选项: -i 提示信息、 -f强制操作(即使不存在该文件或者 unwritealbe,依旧删除并往下进行) -r 递归. 三个点 代表可以重叠使用
FILE 也可以重复. 比如 rm -fir file1 dir1 删除文件file1清空路径dir1.
特别注意: linux下没有恢复功能,找man也没戏。所以慎用rm -r * 这类的操作。我之前就rm过 home下面的东西.
4. ln链接操作/
链接分为硬链接和软链接(加参数-s soft).
语法: ln (-s ) Filename ln_ID
硬\软链接会生成如下的文件:
-rw-rw-r-- 2 caokang caokang 14 Apr 10 23:07 a.v
lrwxrwxrwx 1 caokang caokang 3 Apr 10 23:09 bhard -> b.v
-rw-rw-r-- 1 caokang caokang 0 Apr 10 23:04 b.v
-rw-rw-r-- 2 caokang caokang 14 Apr 10 23:07 hard1
<第六章 使用命令》
1.命令 如cd \ls\rm等,其实都是由C或者C++语言写成的函数。在使用时,相当于调用,并附加以参数。
2.命令参数后 【 l | p 】这种情况,代表 参数l、p只能出现一个。
3.命令行 一行可以输入多个命令;
比如 $ cd /usr/bin;ls;cd -
这个过程是 先进入 /usr/bin/ 。然后显示所有文件。再然后 cd - 返回原来的路径。
4.为了节省输入.可以自己创建一个 叫 lsbin的命令。来替代 cd /usr/bin;ls;cd - 这一个过程。
首先 type lsbin 。会反馈告诉你lsbin是不是一个已经存在的命令。
如果不是,我们就第二步, alias lsbin=‘ cd /usr/bin;ls;cd -’
这之后,我们再用 type lsbin,就能看到 lsbin is alaised to ‘ cd /usr/bin;ls;cd -’
同时我们在命令行中输入 $ lsb,会自动补全lsbin,即代表lsbin成了一个新的命令了。可以直接调用了
alias -p 可以看到所有 通过alias的命令。
好了,当我们不需要lsbin这个命令之后, 我们可以用unalias lsbin 就会删除这个alias.即命令失效.
同样的这个操作,只在本次的中断内有效.
<第七章 重定向>
前半部分
1.重定向标准输出 > .比如 $: ls -l /usr/bin > lsout.txt 每次执行时,都会把ls -l /usr/bin的结果 ,写入lsout.txt文件中
多次执行,每次都会重写覆盖。
如果想每次都把命令运行结果,追尾写。可以使用 >>
2. cat [OPTION]... [File]... 命令用途: 连接多个文件/标准输入 ,输出到标准输出。
cat file1 file2 : 就是把文件file1\file2,连接起来,输出到标准输出(屏幕)
cat file2 file2 > out.txt 就是把文件file1\file2,连接起来,输出到标准输出(被修改制定为文件out.txt)
cat >out.txt : 可以看到 cat空(或者-)。就好似cat标准输入(键盘),输出到out.txt文件。
这个需要注意的是,标准输入时, 需要Ctrl+d。提示输入完毕。
cat file1 - file2 >out.txt : 相当于三个输入,依次为file1、键盘、file2 .将这些东西连接在一起,输出至out.txt
其中{OPTION]选项 主要有
-A : 打印输出所有符号,(包括 table ^I 和 换行$
-n : 打印行号
-s : 压缩空白行,即多个空白行,只输出一个。
3. wc -l filename : 统计一个文件的行数
4. grep 是个很强大的命令。
5. a | b | c 命令a,输出结果转接给 b,进过一定的处理,再送给c。
这个时候,怎么确认命令b,执行是对的呢? 加入了一个tee命令
tee [OPTION]...[FILE]... 把 tee 输入,copy 到 FILE里面去。
这样 a | b | tee tmp.txt | c : 这个命令的效果 a | b | c
/\
屏幕
就是把b的结果 复制一份 到 屏幕上(或者一个tmp文件中).
后面部分:
1. | 管道. a | b 相当于把a命令的输出结果,连接给 命令b,作为其输入。
所以 a | cmd b | c : 这里面的command b就相当于一个滤波器。 把 a的结果,经过一定处理,再输送给c。
2. sort 命令。
记得在 tcl语言中碰到过 lsort, 把list的内容按照 asic increasing 、descreasing排序等情况。
sort 就是linux中,用于排序的命令. (以行为单位,进行排序)
sort [OPTION] ... [FILE] ... 命令功能: 以行为单位,把文件排序结果输出到 标准输出(屏幕)。
参数我们不太可能面面俱到.下面捡几个重要的.
-u : unique 如果行中,出现了一模一样的行. 就会删除一行.
-r : reverse 进行反向排序
从命令功能中看出,sort结果会输出到 标准输出中,如果想用一个文件存储,就要使用 重定向>
有时候,我们想把 sort的结果,直接覆盖原来的文件. 这时候用重定向,就不行了. -o 参数就开始发挥作用了 sort -u test,v -o test.v
按数字排序. 如果
11
101
2
3
排序.结果 会是
101
11
2
3.
相当于按照 ASCii 排序, 先比较第一个\排好,在比第二个. 不应定说谁长,谁就排后面
此时不是我们所想的 因为有可能是 十进制码数字, 这时候, 加入参数 -n 就可以解决.
再讲述 -k 和 -t 选项
例题:
我们有个文件 :
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4
第一个水果种类,第二个是个数. 最后是单价.
我们想 用 个数来排序.
因为 文件, 种类\个数\单价用冒号分离了. 我们使用 -t : 来表明 分号是分隔符. 这样 每行分割成 POS1 : POS2:POS3
-k 2 .制定比较开始 适用于POS2.
$ sort -n -t : -k 2 test,txt -o test,
apple:10:2.5
orange:20:3.4
banana:30:5.5
pear:90:2.3
默认情况下 -t 是指空格. 每行的 pos1 pos2 pos3 pos4 可以直接指定
<第八章> 常见的linux符号使用.
1. ~:符号。在前面说过 ~后如果什么都不跟,就是进入自己的home。
~后跟xiaoming,就进入了小明的home
2.$ 符号是置换符号, 能把很多表达式的值,置换出来,但是在公司电脑里面就是不行, 家里的pc可以. 感觉是 eda工具吧$什么东西变成了它的 语法参数.
3.{1,2,3} 相当于是个列表,会逐一取list值,套入命令中执行.
mkdir {a,b}{1,2} 就会产生四个路径: a1、a2、b1、b2. 这个命令可以批量的创建很多目录.
《第九章: 在命令行中,怎么减少鼠标的使用》
1. 新开terminal : ctrl+shift+t
2.关闭该terminal: ctrl+d (等于输入 exit)
3. 清空该 terminal :ctrl+l (非i)(等于输入 clear)
4.已经输入一些 东西了.发现输错了.
ctrl+ a: 光标移动到 命令行头
ctrl+e :光标移动到 命令行尾
ctrl+f : 光标前移1 forward
crtl+b :光标后移1 backward
ctrl+d :删除光标的字母. (delete)
ctrl+k: 剪切光标到行尾.
ctrl+u: 剪切光标到 行头
ctrl+y: 粘贴
5. history 命令.
这个命令会列出 我们所使用过的命令. 不用你在一个一个的用箭头去翻看了.
直接history 他就会显示出来.不过有个弊端 .它会把所有的都显示出来.
但是有时我们根本不需要那么多, 所以 history 10 就只显示出10个最近使用的命令了。
最近10个命令:
6 cd dir2
7 ;;
8 ll
9 cd ../dir1
10 ll
11 vim a
12 ll
13 history
14 history 10
15 history 10
当然了,history | grep xxx 也是可行的。帮助从几百行的history中挑出你想要的
<第十章 linux 权限 管理>
1. chmod 命令 控制 usr group other的 rwx权限。
常用两种用法: chmod 777 fliename: 把权限都赋予 rwx。
chmod u+x,g-rw,o-rw fliname 给usr增加执行,group other都删掉rw权限。
chmod u=rwx filename usr权限直接赋予rwx
2. umask 控制 新建的目录/文件的 默认属性。
规则: umask = 22
umask存储的是补码。
rwx rwx rwx rw- rw- rw-
000 010 010 000 010 010 ( 可以用 umask 0 修改成 000 000 000)
------------- -------------
rwx r-x r-x rw- r-- r--
其中新建的路径 都是有x权限. 然而新建的文件,是默认没有x权限的。
如果想修改 umask 值,可以直接 umask 000。这样 新建出来的路径都是 777权限,新建的文件都是666权限。
但是 很多情况下,我们没有必要去修改这些参数。直接使用 chmod 新增一部分就好了。
<第11章,进程管理>
1. ps 命令: 显示目前terminal所运行的 所有 进程.
2. ctrl+c 会终止任意命令,如verdi3
3. 如果想让一个命令运行在后台, 则 末尾加上 & .之后 运行后 按下Enter键后,shell依旧可以输入命令.
但是此时, verdi进行后台了,我们怎么通过shell 来关闭它呢 ?
首先通过jobs 查看 目前shell窗口下面运行着什么 .比如我们一个shell下面 跑 dc_shell & 和 verdi &
此时 jobs命令返回的结果是:
[caokang@caokang aaa]$ jobs
[1]- Running verdi &
[2]+ Stopped dc_shell
先让他浮出水面, fb 1/或2 然后ctrl c 停止就或以。
4. 如果忘记 verdi 加& ,等其跑起来.我们可以 ctrl+z.使其进入后台,但是注意此时, verdi处于了 stopped状态,
如果想让他重新工作起来,可以用bg 1.
即 如果忘记输入了 & : 可以用ctrl+c bg命令替代。
《第十二章 shell环境 》
1. terminal 仅仅是个界面而已。它把键盘的输入存入、显示;同时交给shell去解释、shell返回的结果再显示出来。(只显示标准输入和标准输出)
shell 是一类 解释型程序的总称呼. 主要包括有 sh 、bash、csh 等等。可以这样设想下:
C语言中有这样一种函数:
void shell_bash ( input STDIN output : Result )
{
//---------------------------------
PC默认配置
//----------------------------------
case(STDIN)
ls: find ls --> function(dispaly) // 启用function___display
cd: find cd function( enter into ) //启用function___ enter folder
rm: find rm function(delete file) //启用function___delete file
。。。。
}
可以这样说 shell_bash是一个函数,它把 STDIN 读入,然后解释STDIN,调用函数function.并把结果 送出(Result).
同时 人们为了更好的性能追求,在shell_bash这个经典的范本的基础上做了部分修改。演化出了 csh等。其实他们的工作原理都是一样的。
2. 环境变量和shell变量.
环境变量.是描述计算机基本信息的参数.比如Home路径、history_size 、 命令提示符 [caokang @ caokang Proj] $的显示格式定义。
这一类的计算机参数。以及各种PATH路径定义. 这些参数可以修改.但是必须等到我们十分熟悉的时候,再去修改每个环境变量.
shell变量呢,就可以十分随意了,比如 给字符串定义一个别名(alias),制定商用程序的启动路径之类的。这些参数往往处于 工作效率的考虑,
会经常的增减。但是目前我还不了解,如何定义一个shell变量? 什么时候定义? 定义的语法是什么 ? 希望以后了解 环境变量、shell变量之后再做补充。
3. 大致描述下 ls的工作原理。
键盘输入ls ---> 去PATH中去匹配查找----->找到了,执行该x文件,(结合目前系统的参数,logname\group信息),给出文件列表和 权限--->
输出到屏幕
启动商用程序(DC综合软件)过程
键盘输入dc_ck ---->去PATH中匹配查找----->找到了,它是shell变量” alias dc_ck = dc_shell“. ----> 再PATH中再去找dc_shell----->
找到了可执行的dc_shell文件,然后执行它..... 这样一个过程,其实相当于我们 在windows下面的 双击 程序exe快捷键.
<14章 shell提示符>
1. 我们直到 shell是一类,包括有bash、csh、dash等,他们内部定义的参数名其实是不太一样的。
比如 bash里面 [caokang @ beken-4 case_adc] 这个参数:是整个提示符变量。在bash里面,它存储在PS1里面。
然而在csh里面,这个变量名,变成了 prompt.(所以你在csh里面,echo $PS1 会报错)。
2. 以上的知识,应该帮助我们理解为何 有时候 书本上的命令,在家可以用,在公司的PC里面却不能用。因为家里是bash,公司是csh
3. prompt变量 set prompt = "[%n@ $color_green %c $color_white]%#"
(1) 注意 " "和''区别 .
(2) %n 登录名
(3) $color_green : 表示从此之后,颜色变为绿色。
(4) %c 当前工作目录的最后部分
(5) $color_white : 颜色回到 白色
(6) %# $符号
这样显示出来的 提示符 [caokang @ case_adc]$ 其中case_adc是绿色字体。
以上是一个例子,我们还可以自由的设计其他 提示符.
通过该章节,我们最应该了解的 知识点2 .不同shell的参数是不一样的。
<15章 软件包的管理>
1. 回顾在windows下面安装选件过程:
从某一个网站(360软件中心)下载 qq2015.exe文件。然后双击,选择安装路径-->选择安装选项--->安装过程---> 安装完成,生成快捷方式。
或者从同学那边拷贝一个软件到本地、然后安装。
那么,在Linux下面,连基本软件怎么安装都很困惑。软件去哪里下载都不知道。
2. linux系统,获取软件的途径也有两个。
(1) 通过内置的 类似于(软件中心、应用市场)的东西,基本的软件都可以在这里面。
(2) 从非知识产权保护的软件下载一个软件。
(3) 到底该怎么样安装呢??
3. 众所周知,linux阵营分成两派,redhat系列和 debian系列。redhat的软件包以 “xxx.rpm” debian的软件包以“xxx.deb”
下面以 redhat系统为例。
4. 依赖性: 在linux下面,因为软件碎片化、每个软件都会牵连。 比如安装程序a的前提是 必须已经安装了 b和c .而安装b之前必须要
安装d. 这就是 软件包的依赖性。
5. 通过 资源库(软件中心)安装一个程序: yum -install packagexxx
它会完成以下: (1) 下载、(2)环境分析 (3)自动修补依赖性 (4) 安装
yum是一个懒人模式、它会自动的下载、修补依赖性并安装。
yum 语法: yum [OPTION] COMMADN
其中[OPTION]有 -h -t 之类的。可有可无
CMOMAND选项: install
erase
search
update
info
。。。 从-help上看,yum指令的COMMAND,制定了特定的操作,如 安装\卸载\查找\升级
6. 通过 本地copy 安装一个 rpm。 使用 rpm -i packagexxxx。这个仅仅是安装程序包,当遇到依赖性问题时,安装失败,报错
rpm [option ...]
-i 安装
-e 卸载
-U 升级
-t 测试(不安装,只测试其环境)
7. 在redhat里面是 yum和rpm的天下,在debian里面是 apt-get 和dpkg命令
<18 查找文件>
1. locate 只能根据
2. find [path...] [experation]
默认 path是当前路径、 experation是 printf
是不是这样理解: find path... [test & operators ] [action]
查找path路径、满足 test条件时,执行action。
(1) path路径可以是绝对路径或者相对路径。 path1 [path21] 它会把path1以及其下的所有子目录都翻一遍
(2) 条件test可是五花八门: 比如按名字、大小、时间、文件类型、权限、归属等。
| -name pattern pattern 可以直接就是 文件名,或者使用 "正则"
| -iname patern 不区分大小写
| -user username 或者 -group gname 根据文件归属查找
| -perm 754 wrx w-x w-- :相当于找到是这个权限的。
| -perm +111 user可执行或者group可执行、或者other可执行,只要这三个条件满足一个就可以了。
| -perm -121 必须满足 user可执行 & group可写 & other可执行 ,必须满足这三个条件。
| -type f(普通文件) d(目录) l(链接)...
| -size +1k(大于1k) -5k(小于5k) (注意 下面所有带参数,都是+代表大于,-代表小于)
| -cmin -5 :在5分钟之内,修改的 属性或者内容的。
| -mtime -1 : 在一天之内,仅内容修改过。
| -anewer file: 比文件file之前访问的。
| 上面三个, a代表访问、m代表 仅内容修改过、c代表任何变动。 min代表分钟、time代表一天 一般c用的较多。
(3)为了更好的组合 条件,引入了 operators,用于 组合test。
-and 把and 前后两个条件 &起来
-or or前后两个条件 |起来
-not 非 后面的条件。 比如 -not -type f :非普通文件
-() 可以使用(),构造优先级。 但是需要注意转义符 \( expr1 -and expr2 \) -or (-not expr3)
(4) action : 该项默认是 -print 即输出到标准输出。
同时还有其他常用的几个选项:
|-ls 列出
|-delete 删除
|-exec rm "{}" ";" :相当于对test判断的结果执行 rm操作。 注意 "{}" ";"是尾缀,代表命令rm的 对象和 结束。
|-ok rm "{}" ";" :跟exec一样,只是每次都会询问user 是否要rm。
|-ok rm "{}" + :跟上面类似,但是 这个相当于 先把test结果都找到,编程一个list表 +,然后做为rm的对象
|find -name "*.v" | xargs ls -l :相当于把 find结果,管道传给 xargs,然后 xrags用于 ls的对象 即 ls -l argus
3. 借上面的内容,在此处讲下 shell命令行里面的 通配符\元字符和转义符.
通配符: 通常出现在 命令的参数中, 更多的是作为 操作对象.
“*”(>=0个字符) 、 " ? "(1个字符)、[ab] a或者b 、 [!ab]非a且非b 、
{str1 str2} 字符串1 或者字符串2、 [c1-c2] c1到c2
通配符与 正则表达式是不一样的,他们是shell简便的表达. (按照道理来说,正则表达式应该是 从它演变过去的)
在命令参数中, 遇到这写字符,对应的shell命令的c++会解析他们并匹配 还原"参数". 然后才 执行命令.
元字符: 这是一群特殊 函数功能的 字符。 比如 & (后台运行)、 |(管道输出)、$(参数置换)、>(输出重定向) 等。
他们使用了一些 特殊的字符,就是为了特殊化,以起到视觉效果。
转义符: 当越来越多的字符,被赋予了特殊意义,为了能 正常普普通通的使用这些字符,设计了转义符。
单引号 ' ' : 内部字符全部作为普通字母。
双引号" " :双引号内部,只存在变量置换$ ` 命令引用等少见的几个符号还有特殊意思。 其余都变成普通字符
反斜杠 \ : 反斜杠,只把其后的一个字符变为 普通字符。
工作原理: 如果shell 命令行中碰到转义符,会根据 双引号、单引号、反斜杠执行不同的 替换功能。然后再运行程序。
<第十九章 归档和备份>
我们从别的地方下载下来的东西,很多都是 .tar .tgz. .gz格式。傻傻分不清楚。 我们也了解这是 压缩格式,但是怎么解压缩?
还跟windows一样双击? 本章节就讲述这些操作。
1. gzip: 我们知道windows下面的压缩包一般是zip格式的。那么容易记忆 gzip就是压缩的命令。
常用 gzip aaa.v : 压缩文件,原文件消失,压缩文件名不必定义,就是aaa.gz
gzip -c aaa.v > haha.gz : 压缩文件,同时保留原文件、并压缩文件称haha.gz (用 -c 一定要制定 压缩文件名)
-r 为递归压缩,用于含路径的压缩。 递归压缩,不是把他们合成在一起压缩,而是每一层每一个文件单独压缩. 知识相当于 批量压缩操
2. gunzip : 与压缩命令相反,用于解压缩。 -c 保留原.gz文件。
-r : 递归 是逐个解压缩。
还有其他的压缩命令: bzip2 bunzip2
3. 关于 tar的用法 ,在公司的文档中.后面希望补充进来.
我们知道 批量递归压缩,是把每个文件都压缩。其实不太符合我们想要的。
最好是把所有文档,归结成一个 文件。然后再对这个文件进行压缩。 下面讲的tar就是 归档命令。
tar 主选项 [副选项...] tar名 + file/dir
| c 创建tar包
| x 解包
| t 查看包内容(并不解包)
| u 更新包内文件
| r 追加新内容
| p 保留原属性
| v 可视化
| f 制定 tar包名称。(必须放在最后,并紧跟 tar包name 最好以 .tar结尾
| z 对tar包进行 gzip压缩。(注意此时,f参数 仍在最后,tar_name 最好带有后缀 tar.gz
| j 和z一样,不过压缩成bzip2格式
(3) 如果后面的file,是使用相对路径描述的。那么压缩目录也就只到该目录
若使用绝对路径,那么压缩目录 就从根目录起。
(4) zip 和unzip :我们知道在windows下面,zip为主要压缩格式,为了和linux更加方便共享。linux下也有zip压缩命令。
常用 zip -r xxx.zip file/dir
unzip xxx.zip
这个命令主要就是跟 windows打交道。 在linux下,打包压缩,主要还是 tar czvf
<第二十章 正则表达式>
1. 正则表达式,是为了方便的描述的东西。
2. grep 函数: 全程 global search regular expression and print out
即 匹配rep,并打印出来。 本质上就是 匹配"正则表达式"。
grep [OPTION]... PATTERN [FILE]....
整个grep C++函数工作原理: 1. shell命令行 先分析参数列表。完成必要的 通配\转义\元字符转换。
2. C++ 分析整个 PATTERN. 翻译出它想要表达的意思。
3. 对FIle文件逐行的进行匹配。
4. 输出结果。
为了避免 shell命令行 在第二步骤中,先把特殊字符置换。提倡对PATTERN使用单引号。’PATTERN‘
3.[OPTION]选项中,有针对rep的,有针对输出选项的。
rep选项:
-i : 正则表达式忽略大小写
-f Filex :表示这个 PATTERN 来自于文件Filex.(如果是多行的,会一行一行的匹配)
-v :翻转,专门找不匹配的
-w : PATTERN做为一个单词项 匹配
-E :如下文第5条目。整个正则表达式是 扩展型正则表达式
输出现象: -A NUM 打印匹配行 以及该行之后的 NUM行。比如: -A 1 .就打印出 匹配行和下一行
-B NUM 与上面类似,是Before 行
-- color 颜色标注。
-c 只输出匹配行的数目。 (此时,--color -A 1 之类的参数就会自动失效了)
-n 输出时,顺便附带上 其行号
-o 默认输出是一行内容,-o表示只输出匹配值。(此时 -A 1 失效)
-h hide 隐藏 输出的前缀 文件名。
-l 只输出 匹配项所在的 文件名
-L 只输出 不匹配项 的文件名
4. 正则表达式 PATTERN
特殊符号 ^ $ [] - * . ? + {} | () \ 以及字母和阿拉伯数字。
通过赋予 特殊符号 特定的意义,配合上正常字符,来表达抽象难以用程序语言表达的东西。
“.” : 代表任意一个字符。可以看出他有两层含义,第一是任意字符,第二是 它的数量是 1个字符。
“^” : 锚定符,^it 的真正语法是: 以i开始,并紧跟t,等价于以 it开始的行
“$” :锚定符,is$ 的真正语法是: 以s结尾,s前必须是i。等价于 以is结尾。
“|” :在正则表达式内,表示 或的关系。用于多个匹配项的连接
“[ab]” :任意一个字符,均可。 比如 i[ts]就能匹配 it或者is
“[^ab]”:非a非b的字符。 比如i[ts] 无法匹配it或者is,但能匹配 in io之类的
“[a-z]”:如果让输入abcdefg....xyz会十分麻烦。简便的增加了一个"-"符号。就能节省很多
默认情况下 a-z 代表着abcdef...xyz.但也有unix系统内 a-z表示aAbBcC...xXyYzZ.一般由系统语言参数决定。
一般推荐直接改掉系统参数。
POSIX还制定了一个折中的表达方法: 用第三种描述方法:
[:alnum:] 字母和数字集合、相当于a-zA-Z0-9。 (应当理解为何多加入了:,否则[alnum]就是一个rep了)
[:alpha:] 纯字母集合 A-Za-z
[:digit:] 纯数字集合 0-9
[:upper:] 大写字母集合 ,
[:lower:] 小写字母集合.
[:xdigit:]十六进制数集合 0-9A-Fa-f
[:space:] 空格
特别注意的是,[:alpha:]只是表明一个字符集合。
[:alpha:] = a-zA-z. 必须要[[:alnum:]]使用表示一个纯字母。
或者[ [:alpha:][:digit:]] 这相当于[[a-zA-z][0-9]]
下面进入量词阶段。(都是形容前面一项 出现的次数)
“*” :表示 0-无穷个字符。
“?” :表示 0-1个
“+” :表示1-无穷个字符
{m,n} : 至少出现m次,但不多于n次
{,n} 不多于n次
{m,} 至少m次
{m} 恰好m次
5. 基本正则表达式和扩展性正则表达式的区别
这两个表达式的区别主要在于 部分字符的定义上。两者共同支持: ^ $ . [] *
对于其他的符号来说:
基本正则表达式 () {} | ? + 本省是普普通通的符号。 想使用特殊意义,需要加\.
扩展正则表达式 () {} | ? + 就是特殊符号,本身就带有特殊意义。 想普普通通用,需要加\。
<第二十一章 文本处理>
借用一句似懂非懂的话,linux万物皆文本。
那么怎么处理文本,将会变得十分重要. 其实在ic设计中,碰到所有问题也基本是文件。如verilog.v log 报告。工具启动文件。testcase.v等等
那么一般都对文本做什么操作?
针对一个文本来言, ①修改文本: 插入、删减、替换、重新布局、
②提取信息: 寻找关键信息、统计文本。
针对若干文本来言: ①逐个文本进行以上处理。
②文本之间的 连接、比较之类的操作。
1. cat命令. 拼接文件并标准输出。
cat [OPTION] [FILE]... 把 file1 ...filen 拼接在一起,并输出出来。 [OPTION]一般是关于输出项的 选项。
凡是带有 file项的。如果不加任意选项或者为-,代表 从键盘输入,并且键盘输入要以ctrl+d结束。
凡是能标准输出的东西, 如果加上 输出重定向,就能改变输出目的地。
所以 cat > test.txt cat - > test.txt. 就相当于 新建一个文本(冲刷掉原来的内容)。
[OPTION] -A : 显示所有字符,包括 Table^I 和换行符$。 (cat 文件,看换行,就能区分 dos文件和unix文件)
-n : 显示行号
-s : 压缩显示空白行。(连续多个空白行,只显示一个)
cat -n test.txt > file.txt 相当于 对test加 行号操作; cat -s test.txt > file.txt 操作就相当于 压缩空白行的操作。
2. sort [OPTION] ... [FILE] ... 命令功能: 以行为单位,把文件排序结果输出到 标准输出(屏幕)。
| -b 默认情况下,sort以行为单位, 从第一个字符开始。空格也算是字符。 当想从第一个非空格符开始排序,需要加上-b
| -n 按照数字大小比较
| -r 反向排序
| -f 忽视大小写
| - k 5 从pos5 开始进行排序
| -t 指定某个字符为Pos的分割符号 (默认是table和空格)
| -o file 指定输出位置
| -u unique ,即排序中遇到完全一样的行,就丢掉一个。
上面的很多参数都比较常见、重点讨论下 -k选项
-k 2 :表示从 POS2 排序,直到结尾
-k 2nr : 表示从 POS2 --尾按照-nr排序,POS1再按照ascii排 (重排是针对于 POS2 -nr一样的行)
-k 2,2 : 表示从POS2开始排序,结束到2. 然后在从POS1 排。
-k 2,2nr : 表示对 POS2按照 -nr参数排序,完事后从POS1、POS3...按照ascii排序
-k 2,2nr -k 3r :表示对POS2 按照-nr排序,对POS3---尾按照-r排序。POS1按照ascii排
-k 2.1,2.5: 表示从POS2的第一个字符到第5个字符进行ascii排序。
3. cut - remove sections from each line of files 意思很明确,是从files 的每一行中,删掉某些 文本段,并输出至标准输出。
那么怎么判断 需要该删除什么内容呢?
cut [OPTION] ... [FLIE]...
| -c N : cut输出每行的第N个字符;
N-M 输出第N至M个字符
-N 前N个字符、 M- 代表 第M个至结尾。(这个也是经常用的,因为每行的 字符数目是不一样的)
| -d ‘:’ 指定冒号是分隔符. POS1:POS2:.... POSn
| -f 指定POS值。
| -complement 相当于取反输出。输出哪些非cut字符
一般而言,-d -f 是一起用;-c 单独使用。 并且默认 分隔符号是 Table键,不是空格键。 所以在使用空格键为分隔时,需要特别的 定义 -d ' '
这个cut命令 主要是为了从 某一个文件中得到 某一POS位置的字符.并输出重定向保存下来, 以备后用
4. diff命令 其结果所解释的是: 如何把file1 转换成file2。
一般而言,能使用 beyond compare的情况,尽量使用。因为可视化十分的清晰明了。
diff原理,是按照经典动态规划的方法,找到文件file1和file2的对比方法。最简单的得出两者的异同。
此处我们不追求原理,只分析其 四种输出状态: -normal -c -u -y
file1 file2 直接使用 diff file1 file2
a d 1,2d0 //删除file1的 1,2行
c a d a
g h
h >a //file2的第2行内容
>a //file2的第3行内容
6d4 //删除file1的第六行
< //file第六行的内容,即空白行
7a6 //在file1的第七行之后,新增内容,来自file2的第六行
>e //新增的内容是e
如果使用 diff -c file1 file2 如果使用 diff -u file1 file2
*** file1 2017-04-25 13:43:20... --- file1 2017-04-25 13:43:20...
--- file2 2017-04-25 13:44:20... +++ file2 2017-04-25 13:44:20...
*************** @@ -1,7 +1,6 @@
*** 1,7 *** -a
-a -c
-c d
d -f
!f +a
g +a
- g
h -h
--- 1,6 --- +e
d
!a 以上是解释的是从file1,如何变化成file2的步骤。此时
!a 没有把c转换成+-,先删后增
g
h
+e
上半部分是file1的内容,前缀-代表删除,!代表需修改;
下半部分是file2的内容,前缀+代表file需增加,!代表file1需改成的目标
如果是直接使用 diff -y file1 file2
a <
c <
d d
f |a
>a
g g
<
h h
>e
它直接把 file1 和file2列表出来 -W 200 可以定义 间隔
用特殊符号表明了两个文件的区别。
当然我们推荐还是使用beyond compare 去比较文件。
5. patch 命令暂时不管。他使用diff生成的补丁,然后打补丁给file1,使得file1编程file2。
6. tr命令
tr [OPTION]... SET1 [SET2]
| 空 把 SET2中,出现的SET1字符,一一对应的替换掉。
适用于字符集 之间的一一转换。如大小写转换
|-d tr -d 'abc' file2 删掉file2中,SET1中出现过的字符
|-s tr -d 'abc' file2 压缩重复出现的 字符a 、b、c 如aaaaaabbbdefccc ---> abdefc
用于压缩空格十分有效
7. sed命令
sed+[OPTION]+编辑指令+文件
|-对象
|-指令
|- 缩写
|- 参数列表
相当于 对文件执行编辑指令;同时呢sed会逐行的进行 编辑,具体的编辑有 替换、剪切、复制等操作。
因此,编辑指令中,指定对象;需要先是否要逐行? 还是说符合条件的行?
参数列表制定 对象的对象: 即要替换字符,用什么字符替换之类的。
[OPTION]选项,一般用于控制输出:
| -n : 不用打印 pattern_space的内容,见下面的 sed工作机制
| -i :直接更改原文件
sed 适用于对文件的批量处理。有两个参数: (1)该行要不要批量操作?(2) 具体的操作细节。
语法如下:
sed [参数]... file
|-- 行对象指定
|-- 操作细节
|-- argument
行对象指定: (1) 十进制数字: 5 :就代表对该文件的第5行进行操作。其余不操作
(2) /regular expression/ :用"//" 双斜杠 括起来的。匹配上该正则表达式的行进行操作。
(3) $表示最后一行
(4) 1~2:表示 1.3.5.7行为制定行
(5) 1,+2: 表示 1,2,3行
(6) 1\! 除了第一行外,都匹配
(3) 10d 代表仅对第10行操作
/apple/对含有apple的行进行操作
10,/apple/ 代表从第10行开始,直到含/apple/行 结束。
即 address1[,address2] :无地址:对全部行
单地址: 仅对该行
双地址: 从addr1开始到addr2结束
操作细节: 前面的行对象制定好之后,具体要对这一行,做什么样的操作? 删除增加某个字符?改变位置?
这个就是 "操作细节"所要描述的。
|--- 缩写
|--- 具体参数
我们知道,删除、增加、搬移命令,所需要的 参数信息不尽相同。下面大致介绍常用的操作命令:
"s" : s/pattern/replacement/ 使用replacement替换字符pattern
很显然 pattern是regex, 一开始不熟悉的情况下,用精准匹配就行
进一步思考:
(1) 如果想用 enjoy my_holiday 替换 my_holiday.
我们当然可以 s/my_holiday/enjoy my_holiday/ 我们可以使用 & 替代 my_holiday.
简化下来就是: s/my_holiday/enjoy &/
(2) 如果 enjoy your_holiday ,Tom and james. 换成 Tom and james,enjoy your_holiday
s/\(enjoy your_holiday\)\(,\)\(Tom and james\)/\3\2\1/
其实还是利用 正则表达式规则: \(...\) 可以用 \n替代
"d" :只一个d 代表 删除行。
即删除 "行对象指定 的行"
"a" : a 就是append Address1 a "----\n-----" pet.txt
在Address1下面一行,添加 两行----
注意 a前面只能跟一个地址参数。 里面如果添加多行,需要\n
"i" :i就是insert,跟a语法一样,只不过它是在 Address1前一行插入。
"c" : change. 语法: Addr1 [,Addr2] c “-------”
相当于把 Addr1行到Addr2行,每一行的内容,都替换成------
"p" : addr1 [,addr2] p 额外打印出 指定行的内容
"w" : addr1 [,addr2] w file 相当于把 指定的行的内容,存入到file中。
"r" : addr r file :相当于 在匹配addr后,把 file内容逐行读出来输出。
"y" : addr1 [,addr2] y/abc/ABC
对于 制定行,将其中行内容中所有的 a->A b->B c->C
不支持 字符区表示
"n" : 见下文
"N" : 见下文
整个sed命令的 工作机制:
foreach line {
pattern_space <= line[i]; //把每行读入 pattern_space
if(pattern_space match ) //指定行
{
pattern_space <= function{d/a/c/s...,pattern_space} //对Pattern_space执行 cmd,然后写会pattern_space
}
i++; //行指针增加1
if -n not exit {
print pattern_space; //-n参数 是输出控制参数。 默认把每个pattern_space 打印至标准输出
}
}
其中 function 里面是 "n"时,它的函数功能是 pattern_space <= line[i+1] i=i+1;
即把下一行写入pattern_space内,指针加1.
然后再i++,
当 function 里面是"N"时,它的函数功能是 pattern_space <= "pattern_space + line[i+1]" i=i+1;
即 把源pattern_space和 下一行内容,当作一个整体。写入pattern_space. 指针加1
然后再i++,
"q" : 退出sed
"#" :添加注释
"h" : 把此时的 pattern_space内部的内容,覆盖写入 hold_space内
"H" : 把此时的 pattern_space内部的内容,additon写到 原hold_space后面
"g" : 把hold_space内容,覆盖写到pattern_space内
"G" : 把hold_space内容,addition写到 原pattern_space后面
"x" : 互换 hold_space和pattern_space内容
----arugemnet
"g" : 比如 sed '1,5s/caokang/mokang/g :表示从第一行到第五行,每一行的每一个 caokang,都替换成mokang
"2" : 比如 sed '1,5s/caokang/mokang/g :表示从第一行到第五行,每一行的 第2个 cokang,替换成mokang
"2g" : 比如 sed '1,5s/caokang/mokang/g :表示从第一行到第五行,从第2个 cokang,开始,均替换成mokang
"" : 比如 sed '1,5s/caokang/mokang/g :表示从第一行到第五行,只替换第一个cokang
"p" : 比如 sed '1,5s/caokang/mokang/g :表示从第一行到第五行,替换第一个cokang后,
不再继续替换,把替换一个caokang后的该行额外输出在 标准输出
"w file" : 比如 sed '1,5s/caokang/mokang/g :表示从第一行到第五行,替换第一个cokang后,
不再继续替换,把替换一个caokang后的 行内容,写入 file里面。
比较常用的是 "ng"用于指定 替换项
目前,我们如果在命令行中,书写sed -i ‘s/caokang/mokang/g' test.txt
我们一般为了可读性,只会 写一个命令s。
我们可以把 一连串的 命令,写在一个script里面,然后 sed -f script test.txt
<第二十二章 格式化输出>
1. fold命令
fold -w 50 输出显示,位宽是50字符。
fold -w 50 -s 位宽50字符的同时考虑 word的边界
2. pr : 将较大的文件分割成多个页面,适合于打印
3 echo 命令
echo [-ne] 字符串
根据shell 工作原理. shell命令行自己先提前把 字符串做一遍 元字符扩展. 所以 字符串里面有特殊意义字符时,需要用""或者‘’保护起来
-n 不要在最后自动换行.(echo命令,会自动的在最后 打印出一个 换行符号)
-e 开启反斜杠\的转义功能。 我们知道 字符串会被shell预先 元字符扩展。
当字符串不加引号时,反斜杠会提前被 释义。如果加了双引号保护,那么shell元字符扩展之后,里面还有反斜杠\、这个时候 使用-e就能启用 echo 命令 \的转义功能
转义如下: \a :嘟一声
\\ : 反斜杠
\b :删除前一个字符
\t : table字符
\n :换行,光标到行首
\f :换行,光标直接下移(不从头开始) 如echo -e "aaa\fbbb"
aaa
bbb
4. printf命令.
printf format-string [arguement]
printf命令工作机制也是 shell命令行先预先 元字符扩展。 同时由于 printf命令 不会自动的换行,所以 format 里需要定义换行符\n。
为了防止shell 命令行提前 释义,所以 format-string一般都用双引号 括起来。
只有当 "format-string"里面存在 %s %d这类表达式时,arguement才必须存在。
printf里面常用的 反斜杠转义,依旧存在. 于此同时,还有% 定义的特殊格式.
%s 字符串
%.ns 打印字符串前n个字符。 printf "%.3s" sdfer ---> sdf
%-10s 打印10个字节,左对齐
%d 十进制整数
%.5d :十进制数,前面补0 printf "%.3d" 12 ---> 012
%f 浮点数
printf " i am is %s, my age is %d. my high is %.2f “ caokang 25 182.21