前言
最近使用Linux的时候,发现有很多不太熟悉的命令。在查看csdn中的命令集合时,发现很多文章格式不太好,所以写了一篇文章,希望对大家有所帮助!文章内容较多,您可以直接在右侧目录中找到您需要的部分。文章会持续更新,欢迎大家点赞收藏!
更新公告
2020.6.28 新增Linux 三剑客awk、sed、grep
注:为了方便代码阅读,文章代码块中去掉了表示管理员模式的#。这不是一个错误。别搞错了!
1. 基本操作命令
首先,这里有几个热键,非常方便,一定要记住。
Tab键——命令补全功能
Ctrl+c键——停止正在运行的程序
Ctrl+d键——相当于退出、退出
Ctrl+l 键—清屏
1.1 关机与重启
1、关机命令:shutdown
在Linux领域,多用于服务器上,很少遇到关机操作。毕竟,在服务器上运行服务是没有止境的。除非有特殊情况,否则将作为最后手段关闭。
正确的关机流程是:sync shutdown restart shutdown
例如,您可以运行以下命令来关闭:
同步将数据从内存同步到硬盘。
shutdown shutdown 命令,可以使用man shutdown 来阅读帮助文档。例如,您可以运行以下命令来关闭:
shutdown h 10 ‘This server will shutdown after 10 mins’ 该命令告诉大家计算机将在10 分钟后关闭,并将显示在登录用户的当前屏幕上。
shutdown h now 立即关闭
shutdown h 20:25 系统将于今天20:25 关闭
shutdown h +10 十分钟后关闭
shutdown r now 系统将立即重新启动
shutdown r +10 系统将在十分钟后重新启动
reboot的意思是重启,相当于shutdown r now
halt 关闭系统,相当于shutdown -h now 和poweroff
下面是一个简单的例子。
取消定时关机命令:shutdown -c
最后总结一下,无论是重启系统还是关闭系统,都必须先运行sync命令将内存中的数据写入磁盘。
关机命令为shutdown h nowhalt poweroff 和init 0,重启系统命令为shutdown r nowreboot init 6。
2.重启命令:reboot
1.2 帮助命令
帮助命令
关机–帮助:
ifconfig –help:查看网卡信息
man命令(命令手册)
关闭
注意:在man shutdown中打开命令手册后,使用q键退出。
2.目录操作命令
我们知道Linux的目录结构是树形结构,顶层目录是根目录/。
其他目录通过安装添加到树中,并通过卸载删除。
首先我们要知道什么是绝对路径和相对路径。
绝对路径:
路径是从根目录/开始写的,例如:/usr/share/doc这个目录。
相对路径:
路径的写法不是以/开头。比如从/usr/share/doc到/usr/share/man时,可以写成: cd ./man 这就是相对路径的写法!
2.1 目录切换cd
命令:cd目录
cd 是Change Directory 的缩写,是用来改变工作目录的命令。
cd/更改到根目录
cd /usr 切换到根目录下的usr目录
cd ./切换到上一个目录或cd .
cd ~ 切换到主目录
cd – 更改到上次访问的目录
2.2 目录查看ls [-al]
命令:ls [-al]
语法:
ls [-aAdfFhilnrRSt] 目录名称
ls [–color={never,auto,always}] 目录名称
ls [–full-time] 目录名
ls 显示当前目录下的所有目录和文件
ls -a 查看当前目录下所有目录和文件(包括隐藏文件)
ls -l 或ll list 查看当前目录下的所有目录和文件(列表视图,显示更多信息)
ls /dir 查看指定目录下的所有目录和文件,如:ls /usr
列出主目录中的所有文件(包括属性和隐藏文件)
ls-al~
2.3 目录操作【添加、删除、修改、检查】
2.3.1 创建目录[新增] mkdir
如果要创建新目录,请使用mkdir(创建目录)。
语法:
mkdir [-mp] 目录名
选项和参数:
-m:配置文件权限!直接配置,不用看默认权限(umask)~
-p:帮助你直接递归创建需要的目录(包括上层目录)!
示例:请转到/tmp 并尝试创建几个新目录:
cd/tmp
[root@www tmp] mkdir test==创建一个名为test的新目录
[root@www tmp] mkdir test1/test2/test3/test4
mkdir: 无法创建目录`test1/test2/test3/test4\’:
没有这样的文件或目录==没有办法直接创建这个目录!
[root@www tmp] mkdir -p test1/test2/test3/test4
添加-p选项后,就可以为你创建多级目录了!
示例:创建一个具有rwxx–x 权限的目录。
[root@www tmp] mkdir -m 711 test2
[root@www tmp] ls -l
drwxr-xr-x 3根根4096 7月18日12:50测试
drwxr-xr-x 3 root root 4096 七月18 日12:53 testdrwx–x–x 2 root root 4096 七月18 日12:54 test2
在上面的权限部分,如果没有添加-m来强制配置属性,系统将使用默认属性。
如果我们使用-m,如上例所示,我们给出-m 711 来赋予新目录drwxx–x 权限。
2.3.2 删除目录或文件[Delete] rm
rm [-fir] 文件或目录
选项和参数:
-f:表示力。不存在的文件将被忽略,并且不会出现警告消息;
-i:交互模式,删除前会询问用户是否采取操作
-r:递归删除!它最常用于删除目录!这是一个非常危险的选择!
删除文件:
rm 文件删除当前目录下的文件
rm -f file 删除当前目录下的文件(不询问)
删除目录:
rm -r aaa 递归删除当前目录下的aaa目录
rm -rf aaa 递归删除当前目录下的aaa目录(不询问)
全部删除:
rm -rf * 删除当前目录下所有目录和文件
rm -rf /* **[自杀命令!谨慎使用!谨慎使用!谨慎使用! 】**删除根目录下所有文件
注意:rm不仅可以删除目录,还可以删除其他文件或压缩包。为了方便大家记忆,无论如何删除任何目录或文件,只要使用rm -rf 目录/文件/压缩包即可。
rmdir(删除空目录)
语法:
rmdir [-p] 目录名
选项和参数:
**-p:**与上层“空”目录一起删除
删除runoob目录
[root@www tmp] rmdir runoob/
删除mkdir 实例中创建的目录(/tmp 下)!
[root@www tmp] ls -l==查看有多少个目录?
drwxr-xr-x 3根根4096 7月18日12:50测试
drwxr-xr-x 3 root root 4096 七月18 日12:53 testdrwx–x–x 2 root root 4096 七月18 日12:54 test2
[root@www tmp] rmdir test==可以直接删除,没问题
[root@www tmp] rmdir test1==无法删除,还有内容!
rmdir: `test1\’: 目录不为空
[root@www tmp] rmdir -p test1/test2/test3/test4
[root@www tmp] ls -l==看,下面的输出中缺少test 和test1!
drwx–x–x 2根根4096 7月18日12:54 test2
使用-p选项,可以立即删除test1/test2/test3/test4。
不过需要注意的是,这个rmdir只能删除空目录。您可以使用rm 命令删除非空目录。
2.3.3 目录修改【change】mv和cp
mv(移动文件和目录,或更改名称)
语法:
[root@www ~] mv [-fiu] 源目标
[root@www ~] mv [选项] source1 source2 source3 . 目录
2
选项和参数:
-f:force的意思。如果目标文件已经存在,则不询问直接覆盖;
-i:如果目标文件(destination)已经存在,会询问是否覆盖它!
-u:如果目标文件已经存在并且源文件比较新,则会升级(update)
cp(复制文件或目录)
cp 复制文件和目录。
语法:
[root@www ~] cp [-adfilprsu] 源文件(source) 目标文件(destination)
[root@www ~] cp [选项] source1 source2 source3 . 目录
2
选项和参数:
-a:相当于-pdr。关于pdr,请参考以下说明; (常用)
-d:如果源文件是链接文件的属性,则复制链接文件属性而不是文件本身;
-f:表示力。如果目标文件已存在且无法打开,请将其删除并重试;
-i:如果目标文件(目的地)已经存在,覆盖时会先询问动作的进度(常用)
-l:创建硬链接链接文件,而不是复制文件本身;
-p:将文件连同其属性一起复制,而不是使用默认属性(常用于备份);
-r:递归连续复制,用于目录复制行为; (常用)
-s:复制成符号链接文件,也称为“快捷方式”文件;
-u:仅当目标比源旧时才升级目标!
1.重命名目录
命令:mv 当前目录新目录
例如: mv aaa bbb 将目录aaa 更改为bbb
注意:mv语法不仅可以重命名目录,还可以重命名各种文件、压缩包等。
2.剪切目录
命令:mv 目录名称新目录位置
示例:将/usr/tmp目录下的aaa目录剪切到/usr目录mv /usr/tmp/aaa /usr
注意:mv语法不仅可以剪切目录,还可以剪切文件和压缩包。
3.复制目录
命令:cp -r 目录名目录复制的目标位置-r 代表递归
示例:将/usr/tmp目录下的aaa目录复制到/usr目录下cp /usr/tmp/aaa /usr
注意:cp命令不仅可以复制目录,还可以复制文件、压缩包等,复制文件、压缩包时不需要写-r递归。
2.3.4 搜索目录【find】查找
Linux find命令用于查找指定目录下的文件。参数前面的任何字符串都将被视为要搜索的目录的名称。如果使用该命令而不设置任何参数,find命令将在当前目录中搜索子目录和文件。所有找到的子目录和文件都会显示出来。
查找路径-选项[-print][-exec -ok命令]{}\\;
命令:查找目录参数文件名
一些参数:
find 根据以下规则确定路径和表达式。第一部分之前的部分- ( ),命令行中是path,后面是表达式。如果路径是空字符串,则使用当前路径。如果表达式为空字符串,则使用-print 作为默认表达式。
可供表达的选项多达二十或三十种。这里只介绍最常用的。
-mount, -xdev : 只检查与指定目录相同的文件系统中的文件,避免列出其他文件系统中的文件
-amin n : 在过去n 分钟内已被读取
-anewer file : 晚于file file 读取的文件
-atime n 过去n天读过的:个文件
-cmin n : 在过去n分钟内已被修改
-cnewer file : 文件比file文件新
-ctime n : 个文件在过去n天内被修改
例子
列出当前目录及其子目录中所有文件扩展名为c 的文件。
寻找。 -名称“*.c”
列出当前目录及其子目录下的所有通用文件
寻找。 -f型
列出当前目录及其子目录中最近20天内更新的所有文件
寻找。 -ctime -2.4 当前目录显示pwd
pwd(显示当前目录)
pwd是PrintWorkingDirectory的缩写,是显示当前目录的命令。
[root@www ~] pwd [-P]
选项和参数:
-P:显示实际路径而不是使用链接路径。
示例:简单地显示当前工作目录:
[root@www ~] pwd
/root==显示目录~
2
该示例显示实际的工作目录,而不仅仅是链接文件本身的目录名称。
[root@www ~] cd /var/mail==注意,/var/mail 是链接文件
[root@www邮箱]pwd
/var/mail==列出当前工作目录
[root@www邮件] pwd -P
/var/spool/mail==发生了什么事?加不加-P差别很大~
[root@www 邮件] ls -ld /var/mail
lrwxrwxrwx 1 root root 10 Sep 4 17:54 /var/mail – spool/mail
# 看到这里你应该知道为什么了吧?因为/var/mail是链接文件,所以链接到/var/spool/mail
# 因此,添加pwd -P选项后,将不会显示链接文件的数据,而是显示正确的完整路径!
3. 文件操作命令
3.1 文件操作【添加、删除、修改、检查】
3.1.1 新建文件【添加】touch
Linux touch命令用于修改文件或目录的时间属性,包括访问时间和更改时间。如果该文件不存在,系统将创建一个新文件。
ls -l 可以显示文件的时间记录。
语法
touch [-acfm][-d 日期和时间][-r 参考文件或目录] [-t 日期和时间][–help][–version][文件或目录.]
参数说明:
a 更改文件的读取时间记录。
m 更改文件的修改时间记录。
c 如果目标文件不存在,则不会创建新文件。与–no-create 效果相同。
f 未使用,保留是为了与其他UNIX 系统兼容。
r 使用参考文件的时间记录,与–file 作用相同。
d.以各种格式设置时间和日期。
t 设置文件的时间记录,格式与date命令相同。
no-create 不会创建新文件。
help 列出命令格式。
version 列出版本信息。
例子
使用touch命令将testfile文件的时间属性修改为当前系统时间,输入以下命令:
$ touch testfile #修改文件的时间属性
首先使用ls命令查看testfile文件的属性,如下图:
$ ls -l testfile #查看文件的时间属性
#原文件的修改时间为16:09
-rw-r–r– 1 硬盘HDD 55 2011-08-22 16:09 测试文件
执行touch命令修改文件属性后,再次查看文件的时间属性,如下图:
$ touch testfile #修改文件时间属性为当前系统时间
$ ls -l testfile #查看文件的时间属性
#修改文件的时间属性为当前系统时间
-rw-r–r– 1 硬盘HDD 55 2011-08-22 19:53 测试文件
4
当使用\’touch\’指令时,如果指定的文件不存在,将创建一个新的空白文件。例如,使用此命令在当前目录中创建一个空白文件“file”,然后输入以下命令:
$ touch file #新建一个空白文件,命名为“file”
3.1.2 删除文件【删除】rm
rm(删除文件或目录)
语法:
rm [-fir] 文件或目录
选项和参数:
-f:表示力。不存在的文件将被忽略,并且不会出现警告消息;
-i:交互模式,删除前会询问用户是否采取操作
-r:递归删除!它最常用于删除目录!这是一个非常危险的选择!
删除创建的bashrc!
[root@www tmp]# rm -i bashrc
rm: 删除常规文件“bashrc”? y
2
如果加上-i选项,它会自动询问你,防止你删除错误的文件名!
3.1.3 修改文件【change】vi或vim
让我们从一张vim 键盘图开始吧!
vi/vim 的使用
基本上,vi/vim 分为三种模式,即命令模式、插入模式和最后一行模式。这三种模式的作用是:
命令模式:
用户刚刚启动vi/vim 并进入命令模式。
在此状态下的击键将被Vim 识别为命令而不是输入字符。比如我们这时候按i,就不会输入字符了。 i 被视为命令。
以下是一些常用的命令:
i 切换到输入模式输入字符。
x 删除当前光标位置的字符。
: 切换到底行命令模式以在底行输入命令。
如果你想编辑文本:启动Vim,进入命令模式,按i切换到输入模式。
命令模式只有一些最基本的命令,所以还是要依靠底线命令模式来输入更多的命令。
输入方式
在命令模式下按i 进入输入模式。
在输入模式下,可以使用以下按键:
字符键和Shift 组合输入字符
ENTER、回车键、换行
BACK SPACE,退格键,删除光标之前的字符
DEL,删除键,删除光标后一个字符
箭头键可在文本中移动光标
HOME/END,将光标移动到行首/行尾
向上翻页/向下翻页、向上/向下翻页
插入,切换光标到输入/替换模式,光标会变成竖线/下划线
ESC,退出输入模式并切换到命令模式
底线命令模式
在命令模式下按:(英文冒号),进入底线命令模式。
底线命令模式允许您输入单字符或多字符命令,并且有许多可用的命令。
在底线命令模式下,基本命令为(冒号已省略):
q 退出程序
w 保存文件
任何时候按ESC键都可以退出底线命令模式。
简单来说,我们可以将这三种模式想象成如下图标:
打开文件
命令:vi 文件名
示例:通过vi aa.txt 或vim aa.txt 打开当前目录下的aa.txt 文件
注意:使用vi编辑器打开文件后,由于处于命令模式,无法编辑。单击键盘I/A/O 进入编辑模式。
编辑文件
使用vi编辑器打开文件,单击i、a或o键进入编辑模式。
i: 在光标所在字符之前开始插入。
a: 在光标所在字符后开始插入
o: 在光标所在行下方插入新行。
保存或取消编辑
保存文件:
第1步:ESC进入命令行模式
第二步:进入底排模式
第三步:wq保存并退出编辑
取消编辑:
第1步:ESC进入命令行模式
第二步:进入底排模式
第三步:问!撤消本次修改并退出编辑
3.1.4 查看文件【查看】
在Linux系统上使用以下命令查看文件内容:
cat 从第一行开始显示文件内容
tac 从最后一行开始显示。可见tac是cat倒写的!
显示nl时,输出行号!
more 逐页显示文件内容
less 和more 类似,但是比more 更好,它可以向前翻页!
head 只读取前几行
tail只看尾部线条
可以使用*man [command]*查看各个命令的使用文档,如:man cp。
猫
从第一行开始显示文件内容
语法:
猫[-AbEnTv]
选项和参数:
-A:相当于-vET的集成选项,可以列出一些特殊字符而不仅仅是空格;
-b:列出行号,只显示非空行的行号,空行不标注行号!
-E:显示结束换行字节$;
-n:打印行号,空行也会有行号,与-b选项不同;
-T:将[tab]按钮显示为^I;
-v:列出一些不可见的特殊字符
检查/etc/issue文件的内容:
[root@www ~] cat /etc/issue
CentOS 版本6.4(最终版)
内核\\r 位于\\m 上
塔克
tac 命令与cat 命令正好相反。文件内容从最后一行开始显示。可见tac是cat倒写的!喜欢:
[root@www ~] tac /etc/issue
内核\\r 位于\\m 上
CentOS 版本6.4(最终版)
4
NL
显示行号
语法:
nl [-bnw] 文件
选项和参数:
-b:指定指定行号的方式。主要有两种方式:
-b a:表示无论是否为空行,也会列出行号(类似cat -n);
-b t:如果有空行,则不列出空行上的行号(默认值);
-n:列出表示行号的方式。主要有以下三种方法:
-n ln:行号显示在屏幕最左边;
-n rn:行号显示在自己列的最右边,不加0;
-n rz:行号显示在自己列的最右边,并加0;
-w:行号字段占用的位数。
示例1:使用nl列出/etc/issue的内容
[root@www ~] nl /etc/issue
1 CentOS 版本6.4(最终版)
2 内核\\r 上的\\m
更多的
一页一页地翻
[root@www ~] 更多/etc/man_db.config
#
# 由man.conf.in 自动生成
# 配置脚本。
#
# 来自man-1.6d 的man.conf
.(中间省略).
–更多–(28%)==重点就在这一行!你的光标也会在这里等待你的命令
当more 程序运行时,您可以按几个按钮:
空白键(空格):代表翻页;
Enter:代表向下滚动“一行”;
/String:代表本次显示的内容
,向下搜寻『字串』这个关键字;
:f :立刻显示出档名以及目前显示的行数;
q :代表立刻离开 more ,不再显示该文件内容。
b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。
less
一页一页翻动,以下实例输出/etc/man.config文件的内容:
[root@www ~] less /etc/man.config
#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.6d
….(中间省略)….
: <== 这里可以等待你输入命令!
less运行时可以输入的命令有:
空白键 :向下翻动一页;
[pagedown]:向下翻动一页;
[pageup] :向上翻动一页;
/字串 :向下搜寻『字串』的功能;
?字串 :向上搜寻『字串』的功能;
n :重复前一个搜寻 (与 / 或 ? 有关!)
N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
q :离开 less 这个程序;
head
取出文件前面几行
语法:
head [-n number] 文件
选项与参数:
-n :后面接数字,代表显示几行的意思
[root@www ~] head /etc/man.config
默认的情况中,显示前面 10 行!若要显示前 20 行,就得要这样:
[root@www ~] head -n 20 /etc/man.config
tail
取出文件后面几行
语法:
tail [-n number] 文件
选项与参数:
-n :后面接数字,代表显示几行的意思
-f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c才会结束tail的侦测
[root@www ~] tail /etc/man.config
# 默认的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样:
[root@www ~] tail -n 20 /etc/man.config
3.2 权限修改
Linux/Unix 的文件调用权限分为三级 : 文件拥有者、群组、其他。利用 chmod 可以藉以控制文件如何被他人所调用。
使用权限 : 所有使用者
语法
chmod [-cfvR] [–help] [–version] mode file…
参数说明
mode : 权限设定字串,格式如下 :
[ugoa…][[+-=][rwxX]…][,…]
其中:
u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
其他参数说明:
-c : 若该文件权限确实已经更改,才显示其更改动作
-f : 若该文件权限无法被更改也不要显示错误讯息
-v : 显示权限变更的详细资料
-R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)
–help : 显示辅助说明
–version : 显示版本
权限的设定方法有两种, 分别可以使用数字或者是符号来进行权限的变更。
数字类型改变档案权限:
符号类型改变档案权限:
四、压缩文件操作
Linux 常用的压缩与解压缩命令有:tar、gzip、gunzip、bzip2、bunzip2、compress 、uncompress、 zip、 unzip、rar、unrar 等。
4.1 打包和压缩和解压
Windows的压缩文件的扩展名 .zip/.rar
linux中的打包文件:aa.tar
linux中的压缩文件:bb.gz
linux中打包并压缩的文件:.tar.gz
Linux中的打包文件一般是以.tar结尾的,压缩的命令一般是以.gz结尾的。
而一般情况下打包和压缩是一起进行的,打包并压缩后的文件的后缀名一般.tar.gz。
tar
最常用的打包命令是 tar,使用 tar 程序打出来的包我们常称为 tar 包,tar 包文件的命令通常都是以 .tar 结尾的。生成 tar 包后,就可以用其它的程序来进行压缩了,所以首先就来讲讲 tar 命令的基本用法。
tar 命令的选项有很多(用 man tar 可以查看到),但常用的就那么几个选项,下面来举例说明一下:
tar -cf all.tar *.jpg
这条命令是将所有 .jpg 的文件打成一个名为 all.tar 的包。-c 是表示产生新的包,-f 指定包的文件名。
tar -rf all.tar *.gif
这条命令是将所有 .gif 的文件增加到 all.tar 的包里面去,-r 是表示增加文件的意思。
tar -uf all.tar logo.gif
这条命令是更新原来 tar 包 all.tar 中 logo.gif 文件,-u 是表示更新文件的意思。
tar -tf all.tar
这条命令是列出 all.tar 包中所有文件,-t 是列出文件的意思。
tar -xf all.tar
这条命令是解出 all.tar 包中所有文件,-x 是解开的意思。
以上就是 tar 的最基本的用法。为了方便用户在打包解包的同时可以压缩或解压文件,tar 提供了一种特殊的功能。这就是 tar 可以在打包或解包的同时调用其它的压缩程序,比如调用 gzip、bzip2 等。
1) tar调用
gzip 是 GNU 组织开发的一个压缩程序,.gz 结尾的文件就是 gzip 压缩的结果。与 gzip 相对的解压程序是 gunzip。tar 中使用 -z 这个参数来调用gzip。下面来举例说明一下:
tar -czf all.tar.gz *.jpg
这条命令是将所有 .jpg 的文件打成一个 tar 包,并且将其用 gzip 压缩,生成一个 gzip 压缩过的包,包名为 all.tar.gz。
tar -xzf all.tar.gz
这条命令是将上面产生的包解开。
2) tar 调用 bzip2
bzip2 是一个压缩能力更强的压缩程序,.bz2 结尾的文件就是 bzip2 压缩的结果。
与 bzip2 相对的解压程序是 bunzip2。tar 中使用 -j 这个参数来调用 gzip。下面来举例说明一下:
tar -cjf all.tar.bz2 *.jpg
这条命令是将所有 .jpg 的文件打成一个 tar 包,并且将其用 bzip2 压缩,生成一个 bzip2 压缩过的包,包名为 all.tar.bz2
tar -xjf all.tar.bz2
这条命令是将上面产生的包解开。
3)tar 调用 compress
compress 也是一个压缩程序,但是好象使用 compress 的人不如 gzip 和 bzip2 的人多。.Z 结尾的文件就是 bzip2 压缩的结果。与 compress 相对的解压程序是 uncompress。tar 中使用 -Z 这个参数来调用 compress。下面来举例说明一下:
tar -cZf all.tar.Z *.jpg
这条命令是将所有 .jpg 的文件打成一个 tar 包,并且将其用 compress 压缩,生成一个 uncompress 压缩过的包,包名为 all.tar.Z。
tar -xZf all.tar.Z
这条命令是将上面产生的包解开。
有了上面的知识,你应该可以解开多种压缩文件了,下面对于 tar 系列的压缩文件作一个小结:
1) 对于.tar结尾的文件
tar -xf all.tar
2) 对于 .gz 结尾的文件
gzip -d all.gz
gunzip all.gz
)对于 .tgz 或 .tar.gz 结尾的文件
tar -xzf all.tar.gz
tar -xzf all.tgz
2
4) 对于 .bz2 结尾的文件
bzip2 -d all.bz2
bunzip2 all.bz2
2
5) 对于 tar.bz2 结尾的文件
tar -xjf all.tar.bz2
6) 对于 .Z 结尾的文件
uncompress all.Z
7) 对于 .tar.Z 结尾的文件
tar -xZf all.tar.z
另外对于 Windows 下的常见压缩文件 .zip 和 .rar,Linux 也有相应的方法来解压它们:
1) 对于 .zip
linux 下提供了 zip 和 unzip 程序,zip 是压缩程序,unzip 是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:
zip all.zip *.jpg
这条命令是将所有 .jpg 的文件压缩成一个 zip 包:
unzip all.zip
这条命令是将 all.zip 中的所有文件解压出来。
2) 对于 .rar
要在 linux 下处理 .rar 文件,需要安装 RAR for Linux。下载地址:http://www.rarsoft.com/download.htm,下载后安装即可。
tar -xzpvf rarlinux-x64-5.6.b5.tar.gz
cd rar
make
这样就安装好了,安装后就有了 rar 和 unrar 这两个程序,rar 是压缩程序,unrar 是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:
rar a all *.jpg
这条命令是将所有 .jpg 的文件压缩成一个 rar 包,名为 all.rar,该程序会将 .rar 扩展名将自动附加到包名后。
unrar e all.rar
这条命令是将 all.rar 中的所有文件解压出来
4.2扩展内容
tar
-c: 建立压缩档案
-x:解压
-t:查看内容 shell
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件
这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。
-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出
下面的参数 -f 是必须的:
-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。
# tar -cf all.tar *.jpg
这条命令是将所有 .jpg 的文件打成一个名为 all.tar 的包。-c 是表示产生新的包,-f 指定包的文件名。
tar -rf all.tar *.gif
这条命令是将所有 .gif 的文件增加到 all.tar 的包里面去。-r 是表示增加文件的意思。
tar -uf all.tar logo.gif
这条命令是更新原来 tar 包 all.tar 中 logo.gif 文件,-u 是表示更新文件的意思。
tar -tf all.tar
这条命令是列出 all.tar 包中所有文件,-t 是列出文件的意思。
tar -xf all.tar
这条命令是解出 all.tar 包中所有文件,-x 是解开的意思。
压缩
tar –cvf jpg.tar *.jpg // 将目录里所有jpg文件打包成 tar.jpg
tar –czf jpg.tar.gz *.jpg // 将目录里所有jpg文件打包成 jpg.tar 后,并且将其用 gzip 压缩,生成一个 gzip 压缩过的包,命名为 jpg.tar.gz
tar –cjf jpg.tar.bz2 *.jpg // 将目录里所有jpg文件打包成 jpg.tar 后,并且将其用 bzip2 压缩,生成一个 bzip2 压缩过的包,命名为jpg.tar.bz2
tar –cZf jpg.tar.Z *.jpg // 将目录里所有 jpg 文件打包成 jpg.tar 后,并且将其用 compress 压缩,生成一个 umcompress 压缩过的包,命名为jpg.tar.Z
rar a jpg.rar *.jpg // rar格式的压缩,需要先下载 rar for linux
zip jpg.zip *.jpg // zip格式的压缩,需要先下载 zip for linux
解压
tar –xvf file.tar // 解压 tar 包
tar -xzvf file.tar.gz // 解压 tar.gz
tar -xjvf file.tar.bz2 // 解压 tar.bz2
tar –xZvf file.tar.Z // 解压 tar.Z
unrar e file.rar // 解压 rar
unzip file.zip // 解压 zip
总结
1、*.tar 用 tar –xvf 解压
2、*.gz 用 gzip -d或者gunzip 解压
3、*.tar.gz和*.tgz 用 tar –xzf 解压
4、*.bz2 用 bzip2 -d或者用bunzip2 解压
5、*.tar.bz2用tar –xjf 解压
6、*.Z 用 uncompress 解压
7、*.tar.Z 用tar –xZf 解压
8、*.rar 用 unrar e解压
9、*.zip 用 unzip 解压
五、查找命令
5.1 grep
grep命令是一种强大的文本搜索工具
使用实例:
ps -ef | grep sshd 查找指定ssh服务进程
ps -ef | grep sshd | grep -v grep 查找指定服务进程,排除gerp身
ps -ef | grep sshd -c 查找指定进程个数
从文件内容查找匹配指定字符串的行:
$ grep \”被查找的字符串\” 文件名
例子:在当前目录里第一级文件夹中寻找包含指定字符串的 .in 文件
grep \”thermcontact\” /.in
从文件内容查找与正则表达式匹配的行:
$ grep –e \”正则表达式\” 文件名
查找时不区分大小写:
$ grep –i \”被查找的字符串\” 文件名
查找匹配的行数:
$ grep -c “被查找的字符串” 文件名
从文件内容查找不匹配指定字符串的行:
$ grep –v \”被查找的字符串\” 文件名
5.2 find
find命令在目录结构中搜索文件,并对搜索结果执行指定的操作。
find 默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。
使用实例:
find . -name \”*.log\” -ls 在当前目录查找以.log结尾的文件,并显示详细信息。
find /root/ -perm 600 查找/root/目录下权限为600的文件
find . -type f -name \”*.log\” 查找当目录,以.log结尾的普通文件
find . -type d | sort 查找当前所有目录并排序
find . -size +100M 查找当前目录大于100M的文件
从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 “ERROR” 的行:
$ find / -type f -name \”*.log\” | xargs grep \”ERROR\”
例子:从当前目录开始查找所有扩展名为 .in 的文本文件,并找出包含 “thermcontact” 的行:
find . -name \”*.in\” | xargs grep \”thermcontact\”
5.3 locate
locate 让使用者可以很快速的搜寻某个路径。默认每天自动更新一次,所以使用locate 命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。如果数据库中没有查询的数据,则会报出locate: can not stat () `/var/lib/mlocate/mlocate.db’: No such file or directory该错误!updatedb即可!
yum -y install mlocate 如果是精简版CentOS系统需要安装locate命令
使用实例:
updatedb
locate /etc/sh 搜索etc目录下所有以sh开头的文件
locate pwd 查找和pwd相关的所有文件
5.4 whereis
whereis命令是定位可执行文件、源代码文件、帮助文件在文件系统中的位置。这些文件的属性应属于原始代码,二进制文件,或是帮助文件。
使用实例:
whereis ls 将和ls文件相关的文件都查找出来
5.5 which
which命令的作用是在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。
使用实例:
which pwd 查找pwd命令所在路径
which java 查找path中java的路径
2
六、su、sudo
6.1 su
Linux su命令用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码。
使用权限:所有使用者。
语法
su [-fmp] [-c command] [-s shell] [–help] [–version] [-] [USER [ARG]]
参数说明:
-f 或 –fast 不必读启动档(如 csh.cshrc 等),仅用于 csh 或 tcsh
-m -p 或 –preserve-environment 执行 su 时不改变环境变数
-c command 或 –command=command 变更为帐号为 USER 的使用者并执行指令(command)后再变回原来使用者
-s shell 或 –shell=shell 指定要执行的 shell (bash csh tcsh 等),预设值为 /etc/passwd 内的该使用者(USER) shell
–help 显示说明文件
–version 显示版本资讯
– -l 或 –login 这个参数加了之后,就好像是重新 login 为该使用者一样,大部份环境变数(HOME SHELL USER等等)都是以该使用者(USER)为主,并且工作目录也会改变,如果没有指定 USER ,内定是 root
USER 欲变更的使用者帐号
ARG 传入新的 shell 参数
实例
变更帐号为 root 并在执行 ls 指令后退出变回原使用者
su -c ls root
变更帐号为 root 并传入 -f 参数给新执行的 shell
su root -f
变更帐号为 clsung 并改变工作目录至 clsung 的家目录(home dir)
su – clsung
切换用户
hnlinux@runoob.com:~$ whoami //显示当前用户
hnlinux
hnlinux@runoob.com:~$ pwd //显示当前目录
/home/hnlinux
hnlinux@runoob.com:~$ su root //切换到root用户
密码:
root@runoob.com:/home/hnlinux# whoami
root
root@runoob.com:/home/hnlinux# pwd
/home/hnlinux
切换用户,改变环境变量
hnlinux@runoob.com:~$ whoami //显示当前用户
hnlinux
hnlinux@runoob.com:~$ pwd //显示当前目录
/home/hnlinux
hnlinux@runoob.com:~$ su – root //切换到root用户
密码:
root@runoob.com:/home/hnlinux# whoami
root
root@runoob.com:/home/hnlinux# pwd //显示当前目录
/root
su用于用户之间的切换。但是切换前的用户依然保持登录状态。如果是root 向普通或虚拟用户切换不需要密码,反之普通用户切换到其它任何用户都需要密码验证。
su test:切换到test用户,但是路径还是/root目录
su – test : 切换到test用户,路径变成了/home/test
su : 切换到root用户,但是路径还是原来的路径
su – : 切换到root用户,并且路径是/root
su不足:如果某个用户需要使用root权限、则必须要把root密码告诉此用户。
退出返回之前的用户:exit
6.2 sudo
sudo是为所有想使用root权限的普通用户设计的。可以让普通用户具有临时使用root权限的权利。只需输入自己账户的密码即可。
进入sudo配置文件命令:
vi /etc/sudoer或者visudo
案例:
允许hadoop用户以root身份执行各种应用命令,需要输入hadoop用户的密码。
hadoop ALL=(ALL) ALL
案例:
只允许hadoop用户以root身份执行ls 、cat命令,并且执行时候免输入密码。
配置文件中:
hadoop ALL=NOPASSWD: /bin/ls, /bin/cat
su root -f
变更帐号为 clsung 并改变工作目录至 clsung 的家目录(home dir)
su – clsung
切换用户
hnlinux@runoob.com:~$ whoami //显示当前用户
hnlinux
hnlinux@runoob.com:~$ pwd //显示当前目录
/home/hnlinux
hnlinux@runoob.com:~$ su root //切换到root用户
密码:
root@runoob.com:/home/hnlinux# whoami
root
root@runoob.com:/home/hnlinux# pwd
/home/hnlinux
切换用户,改变环境变量
hnlinux@runoob.com:~$ whoami //显示当前用户
hnlinux
hnlinux@runoob.com:~$ pwd //显示当前目录
/home/hnlinux
hnlinux@runoob.com:~$ su – root //切换到root用户
密码:
root@runoob.com:/home/hnlinux# whoami
root
root@runoob.com:/home/hnlinux# pwd //显示当前目录
/root
su用于用户之间的切换。但是切换前的用户依然保持登录状态。如果是root 向普通或虚拟用户切换不需要密码,反之普通用户切换到其它任何用户都需要密码验证。
su test:切换到test用户,但是路径还是/root目录
su – test : 切换到test用户,路径变成了/home/test
su : 切换到root用户,但是路径还是原来的路径
su – : 切换到root用户,并且路径是/root
su不足:如果某个用户需要使用root权限、则必须要把root密码告诉此用户。
退出返回之前的用户:exit
七、下载与安装 yum
yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器。
基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。
yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。
yum 语法
yum [options] [command] [package …]
**options:**可选,选项包括-h(帮助),-y(当安装过程提示选择全部为\”yes\”),-q(不显示安装的过程)等等。
**command:**要进行的操作。
package操作的对象。
yum常用命令
1.列出所有可更新的软件清单命令:yum check-update
2.更新所有软件命令:yum update
3.仅安装指定的软件命令:yum install <package_name>
4.仅更新指定的软件命令:yum update <package_name>
5.列出所有可安裝的软件清单命令:yum list
6.删除软件包命令:yum remove <package_name>
7.查找软件包 命令:yum search
8.清除缓存命令:
yum clean packages: 清除缓存目录下的软件包
yum clean headers: 清除缓存目录下的 headers
yum clean oldheaders: 清除缓存目录下旧的 headers
yum clean, yum clean all (= yum clean packages; yum clean oldheaders) :清除缓存目录下的软件包及旧的headers
实例 安装 pam-devel
[root@www ~] yum install pam-devel
Setting up Install Process
Parsing package install arguments
Resolving Dependencies <==先检查软件的属性相依问题
–> Running transaction check
—> Package pam-devel.i386 0:0.99.6.2-4.el5 set to be updated
–> Processing Dependency: pam = 0.99.6.2-4.el5 for package: pam-devel
–> Running transaction check
—> Package pam.i386 0:0.99.6.2-4.el5 set to be updated
filelists.xml.gz 100% |=========================| 1.6 MB 00:05
filelists.xml.gz 100% |=========================| 138 kB 00:00
-> Finished Dependency Resolution
……(省略)
1实例 2
移除 pam-devel
[root@www ~] yum remove pam-devel
Setting up Remove Process
Resolving Dependencies <==同样的,先解决属性相依的问题
–> Running transaction check
—> Package pam-devel.i386 0:0.99.6.2-4.el5 set to be erased
–> Finished Dependency Resolution
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Removing:
pam-devel i386 0.99.6.2-4.el5 installed 495 k
Transaction Summary
=============================================================================
Install 0 Package(s)
Update 0 Package(s)
Remove 1 Package(s) <==还好,并没有属性相依的问题,单纯移除一个软件
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Erasing : pam-devel ######################### [1/1]
Removed: pam-devel.i386 0:0.99.6.2-4.el5
Complete!
2222230
332
实例 3
利用 yum 的功能,找出以 pam 为开头的软件名称有哪些?
[root@www ~] yum list pam*
Installed Packages
pam.i386 0.99.6.2-3.27.el5 installed
pam_ccreds.i386 3-5 installed
pam_krb5.i386 2.2.14-1 installed
pam_passwdqc.i386 1.0.2-1.2.2 installed
pam_pkcs11.i386 0.5.3-23 installed
pam_smb.i386 1.1.7-7.2.1 installed
Available Packages <==底下则是『可升级』的或『未安装』的
pam.i386 0.99.6.2-4.el5 base
pam-devel.i386 0.99.6.2-4.el5 base
pam_krb5.i386 2.2.14-10 base
1国内 yum 源
网易(163)yum源是国内最好的yum源之一 ,无论是速度还是软件版本,都非常的不错。
将yum源设置为163 yum,可以提升软件包安装和更新的速度,同时避免一些常见软件版本无法找到。
安装步骤
首先备份/etc/yum.repos.d/CentOS-Base.repo
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
下载对应版本 repo 文件, 放入 /etc/yum.repos.d/ (操作前请做好相应备份)
CentOS5 :http://mirrors.163.com/.help/CentOS5-Base-163.repo
CentOS6 :http://mirrors.163.com/.help/CentOS6-Base-163.repo
CentOS7 :http://mirrors.163.com/.help/CentOS7-Base-163.repo
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
mv CentOS6-Base-163.repo CentOS-Base.repo
2
运行以下命令生成缓存
yum clean all
yum makecache
2
除了网易之外,国内还有其他不错的 yum 源,比如中科大和搜狐。
中科大的 yum 源,安装方法查看:https://lug.ustc.edu.cn/wiki/mirrors/help/centos
sohu 的 yum 源安装方法查看: http://mirrors.sohu.com/help/centos.htm
Linux 三剑客(awk,sed,grep)
awk、sed、grep更适合的方向:
grep 更适合单纯的查找或匹配文本
sed 更适合编辑匹配到的文本
awk 更适合格式化文本,对文本进行较复杂格式处理
awk
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
语法
awk [选项参数] \’script\’ var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
-F fs or –field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
-v var=value or –asign var=value
赋值一个用户定义变量。
-f scripfile or –file scriptfile
从脚本文件中读取awk命令。
-mf nnn and -mr nnn
对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
-W compact or –compat, -W traditional or –traditional
在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
-W copyleft or –copyleft, -W copyright or –copyright
打印简短的版权信息。
-W help or –help, -W usage or –usage
打印全部awk选项和每个选项的简短说明。
-W lint or –lint
打印不能向传统unix平台移植的结构的警告。
-W lint-old or –lint-old
打印关于不能向传统unix平台移植的结构的警告。
-W posix
打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符** 和 **=不能代替^ 和 ^=;fflush无效。
-W re-interval or –re-inerval
允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
-W source program-text or –source program-text
使用program-text作为源代码,可与-f命令混用。
-W version or –version
打印bug报告信息的版本。
基本用法
log.txt文本内容如下:
2 this is a test
3 Are you like awk
This\’s a test
10 There are orange,apple,mongo
4
用法一:
awk \'{[pattern] action}\’ {filenames} # 行匹配语句 awk \’\’ 只能用单引号
实例:
# 每行按空格或TAB分割,输出文本中的1、4项
$ awk \'{print $1,$4}\’ log.txt
———————————————
2 a
3 like
This\’s
10 orange,apple,mongo
# 格式化输出
$ awk \'{printf \”%-8s %-10s\\n\”,$1,$4}\’ log.txt
———————————————
2 a
3 like
This\’s
10 orange,apple,mongo
1用法二:
awk -F #-F相当于内置变量FS, 指定分割字符
实例:
# 使用\”,\”分割
$ awk -F, \'{print $1,$2}\’ log.txt
———————————————
2 this is a test
3 Are you like awk
This\’s a test
10 There are orange apple
# 或者使用内建变量
$ awk \’BEGIN{FS=\”,\”} {print $1,$2}\’ log.txt
———————————————
2 this is a test
3 Are you like awk
This\’s a test
10 There are orange apple
# 使用多个分隔符.先使用空格分割,然后对分割结果再使用\”,\”分割
$ awk -F \'[ ,]\’ \'{print $1,$2,$5}\’ log.txt
———————————————
2 this test
3 Are awk
This\’s a
10 There apple
2用法三:
awk -v # 设置变量
实例:
$ awk -va=1 \'{print $1,$1+a}\’ log.txt
———————————————
2 3
3 4
This\’s 10 1 $ awk -va=1 -vb=s \'{print $1,$1+a,$1b}\’ log.txt
———————————————
2 3 2s
3 4 3s
This\’s 1 This\’ss
10 11 10s
1用法四:
awk -f {awk脚本} {文件名}
实例:
$ awk -f cal.awk log.txt
运算符
运算符 描述
= += -= *= /= %= ^= **= 赋值
?: C条件表达式
|| 逻辑或
&& 逻辑与
~ 和 !~ 匹配正则表达式和不匹配正则表达式
< <= > >= != == 关系运算符
空格 连接
+ – 加,减
* / % 乘,除与求余
+ – ! 一元加,减和逻辑非
^ *** 求幂
++ – 增加或减少,作为前缀或后缀
$ 字段引用
in 数组成员
过滤第一列大于2的行
$ awk \’$1>2\’ log.txt #命令
#输出
3 Are you like awk
This\’s a test
10 There are orange,apple,mongo
过滤第一列等于2的行
$ awk \’$1==2 {print $1,$3}\’ log.txt #命令
#输出
2 is
过滤第一列大于2并且第二列等于’Are’的行
$ awk \’$1>2 && $2==\”Are\” {print $1,$2,$3}\’ log.txt #命令
#输出
3 Are you
内建变量
变量 描述
$n 当前记录的第n个字段,字段间由FS分隔
$0 完整的输入记录
ARGC 命令行参数的数目
ARGIND 命令行中当前文件的位置(从0开始算)
ARGV 包含命令行参数的数组
CONVFMT 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO 最后一个系统错误的描述
FIELDWIDTHS 字段宽度列表(用空格键分隔)
FILENAME 当前文件名
FNR 各文件分别计数的行号
FS 字段分隔符(默认是任何空格)
IGNORECASE 如果为真,则进行忽略大小写的匹配
NF 一条记录的字段的数目
NR 已经读出的记录数,就是行号,从1开始
OFMT 数字的输出格式(默认值是%.6g)
OFS 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符
ORS 输出记录分隔符(默认值是一个换行符)
RLENGTH 由match函数所匹配的字符串的长度
RS 记录分隔符(默认是一个换行符)
RSTART 由match函数所匹配的字符串的第一个位置
SUBSEP 数组下标分隔符(默认值是/034)
$ awk \’BEGIN{printf \”%4s %4s %4s %4s %4s %4s %4s %4s %4s\\n\”,\”FILENAME\”,\”ARGC\”,\”FNR\”,\”FS\”,\”NF\”,\”NR\”,\”OFS\”,\”ORS\”,\”RS\”;printf \”———————————————\\n\”} {printf \”%4s %4s %4s %4s %4s %4s %4s %4s %4s\\n\”,FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}\’ log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
———————————————
log.txt 2 1 5 log.txt 2 2 5 2
log.txt 2 3 3 3
log.txt 2 4 4 4
$ awk -F\\\’ \’BEGIN{printf \”%4s %4s %4s %4s %4s %4s %4s %4s %4s\\n\”,\”FILENAME\”,\”ARGC\”,\”FNR\”,\”FS\”,\”NF\”,\”NR\”,\”OFS\”,\”ORS\”,\”RS\”;printf \”———————————————\\n\”} {printf \”%4s %4s %4s %4s %4s %4s %4s %4s %4s\\n\”,FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}\’ log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
———————————————
log.txt 2 1 \’ 1 log.txt 2 2 \’ 1 2
log.txt 2 3 \’ 2 3
log.txt 2 4 \’ 1 4
# 输出顺序号 NR, 匹配文本行号
$ awk \'{print NR,FNR,$1,$2,$3}\’ log.txt
———————————————
1 1 2 this is
2 2 3 Are you
3 3 This\’s a test
4 4 10 There are
# 指定输出分割符
$ awk \'{print $1,$2,$5}\’ OFS=\” $ \” log.txt
———————————————
2 $ this $ test
3 $ Are $ awk
This\’s $ a $
10 $ There $
2222使用正则,字符串匹配
# 输出第二列包含 \”th\”,并打印第二列与第四列
$ awk \’$2 ~ /th/ {print $2,$4}\’ log.txt
———————————————
this a
4
~ 表示模式开始。// 中是模式。
# 输出包含 \”re\” 的行
$ awk \’/re/ \’ log.txt
———————————————
3 Are you like awk
10 There are orange,apple,mongo
忽略大小写
$ awk \’BEGIN{IGNORECASE=1} /this/\’ log.txt
———————————————
2 this is a test
This\’s a test
4
模式取反
$ awk \’$2 !~ /th/ {print $2,$4}\’ log.txt
———————————————
Are like
a
There orange,apple,mongo
$ awk \’!/th/ {print $2,$4}\’ log.txt
———————————————
Are like
a
There orange,apple,mongo
awk脚本
关于 awk 脚本,我们需要注意两个关键词 BEGIN 和 END。
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
假设有这么一个文件(学生成绩表):
$ cat score.txt
Marry 2143 78 84 7Jack 2321 66 78 45
Tom 2122 48 77 7Mike 2537 87 97 95
Bob 2415 40 57 62
我们的 awk 脚本如下:
$ cat cal.awk
#!/bin/awk -f
#运行前
BEGIN {
math = 0
english = 0
computer = 0
printf \”NAME NO. MATH ENGLISH COMPUTER TOTAL\\n\”
printf \”———————————————\\n\”
}
#运行中
{
math+=$3
english+=$4
computer+=$5
printf \”%-6s %-6s %4d %8d %8d %8d\\n\”, $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
printf \”———————————————\\n\”
printf \” TOTAL:%10d %8d %8d \\n\”, math, english, computer
printf \”AVERAGE:%10.2f %8.2f %8.2f\\n\”, math/NR, english/NR, computer/NR
}
2我们来看一下执行结果:
$ awk -f cal.awk score.txt
NAME NO. MATH ENGLISH COMPUTER TOTAL
———————————————
Marry 2143 78 84 77 23Jack 2321 66 78 45 18Tom 2122 48 77 71 19Mike 2537 87 97 95 27Bob 2415 40 57 62 15———————————————
TOTAL: 319 393 350
AVERAGE: 63.80 78.60 70.00
1另外一些实例
AWK 的 hello world 程序为:
BEGIN { print \”Hello, world!\” }
计算文件大小
$ ls -l *.txt | awk \'{sum+=$5} END {print sum}\’
————————————————–
6665从文件中找出长度大于 80 的行:
awk \’length>80\’ log.txt
打印九九乘法表
seq 9 | sed \’H;g\’ | awk -v RS=\’\’ \'{for(i=1;i<=NF;i++)printf(\”%dx%d=%d%s\”, i, NR, i*NR, i==NR?\”\\n\”:\”\\t\”)}\’
sed
Linux sed 命令是利用脚本来处理文本文件。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
语法
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明:
-e<script>或–expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或–file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或–help 显示帮助。
-n或–quiet或–silent 仅显示script处理后的结果。
-V或–version 显示版本信息。
动作说明:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
实例
在testfile文件的第四行后添加一行,并将结果输出到标准输出,在命令行提示符下输入如下命令:
sed -e 4a\\newLine testfile
首先查看testfile中的内容如下:
$ cat testfile #查看testfile 中的内容
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
使用sed命令后,输出结果如下:
$ sed -e 4a\\newline testfile #使用sed 在第四行后添加新字符串
HELLO LINUX! #testfile文件原有的内容
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
newline
以行为单位的新增/删除
将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除!
[root@www ~] nl /etc/passwd | sed \’2,5d\’
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
…..(后面省略)…..
sed 的动作为 ‘2,5d’ ,那个 d 就是删除!因为 2-5 行给他删除了,所以显示的数据就没有 2-5 行罗~ 另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦!同时也要注意的是, sed 后面接的动作,请务必以 ‘’ 两个单引号括住喔!
只要删除第 2 行
nl /etc/passwd | sed \’2d\’
要删除第 3 到最后一行
nl /etc/passwd | sed \’3,$d\’
在第二行后(亦即是加在第三行)加上『drink tea?』字样!
[root@www ~] nl /etc/passwd | sed \’2a drink tea\’
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
…..(后面省略)…..
那如果是要在第二行前
nl /etc/passwd | sed \’2i drink tea\’
如果是要增加两行以上,在第二行后面加入两行字,例如 Drink tea or … 与 drink beer?
[root@www ~] nl /etc/passwd | sed \’2a Drink tea or ……\\
> drink beer ?\’
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ……
drink beer ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
…..(后面省略)…..
每一行之间都必须要以反斜杠『 \\ 』来进行新行的添加喔!所以,上面的例子中,我们可以发现在第一行的最后面就有 \\ 存在。
以行为单位的替换与显示
将第2-5行的内容取代成为『No 2-5 number』呢?
[root@www ~] nl /etc/passwd | sed \’2,5c No 2-5 number\’
1 root:x:0:0:root:/root:/bin/bash
No 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync
…..(后面省略)…..
透过这个方法我们就能够将数据整行取代了!
仅列出 /etc/passwd 文件内的第 5-7 行
[root@www ~] nl /etc/passwd | sed -n \’5,7p\’
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
4
可以透过这个 sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号选择出来显示。
数据的搜寻并显示
搜索 /etc/passwd有root关键字的行
nl /etc/passwd | sed \’/root/p\’
1 root:x:0:0:root:/root:/bin/bash
1 root:x:0:0:root:/root:/bin/bash
2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3 bin:x:2:2:bin:/bin:/bin/sh
4 sys:x:3:3:sys:/dev:/bin/sh
5 sync:x:4:65534:sync:/bin:/bin/sync
….下面忽略
如果root找到,除了输出所有行,还会输出匹配行。
使用-n的时候将只打印包含模板的行。
nl /etc/passwd | sed -n \’/root/p\’
1 root:x:0:0:root:/root:/bin/bash
2
数据的搜寻并删除
删除/etc/passwd所有包含root的行,其他行输出
nl /etc/passwd | sed \’/root/d\’
2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3 bin:x:2:2:bin:/bin:/bin/sh
….下面忽略
#第一行的匹配root已经删除了
数据的搜寻并执行命令
搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:
nl /etc/passwd | sed -n \’/root/{s/bash/blueshell/;p;q}\’
1 root:x:0:0:root:/root:/bin/blueshell
2
最后的q是退出。
数据的搜寻并替换
除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:
sed \’s/要被取代的字串/新的字串/g\’
先观察原始信息,利用 /sbin/ifconfig 查询 IP
[root@www ~] /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:…..(以下省略)…..
本机的ip是192.168.1.100。
将 IP 前面的部分予以删除
[root@www ~] /sbin/ifconfig eth0 | grep \’inet addr\’ | sed \’s/^.*addr://g\’
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
2
接下来则是删除后续的部分,亦即: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
将 IP 后面的部分予以删除
[root@www ~] /sbin/ifconfig eth0 | grep \’inet addr\’ | sed \’s/^.*addr://g\’ | sed \’s/Bcast.*$//g\’
192.168.1.100
2
多点编辑
一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell
nl /etc/passwd | sed -e \’3,$d\’ -e \’s/bash/blueshell/\’
1 root:x:0:0:root:/root:/bin/blueshell
2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。
直接修改文件内容(危险动作)
sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试! 我们还是使用文件 regular_express.txt 文件来测试看看吧!
regular_express.txt 文件内容如下:
[root@www ~] cat regular_express.txt
runoob.
google.
taobao.
facebook.
zhihu-
weibo-
利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !
[root@www ~] sed -i \’s/\\.$/\\!/g\’ regular_express.txt
[root@www ~] cat regular_express.txt
runoob!
google!
taobao!
facebook!
zhihu-
weibo-
:q:q
利用 sed 直接在 regular_express.txt 最后一行加入 # This is a test:
[root@www ~] sed -i \’$a # This is a test\’ regular_express.txt
[root@www ~] cat regular_express.txt
runoob!
google!
taobao!
facebook!
zhihu-
weibo-
# This is a test
由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增 # This is a test!
sed 的 -i 选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!
追加行的说明:
sed -e 4a\\newline testfile
a 动作是在匹配的行之后追加字符串,追加的字符串中可以包含换行符(实现追加多行的情况)。
追加一行的话前后都不需要添加换行符 \\n,只有追加多行时在行与行之间才需要添加换行符(最后一行最后也无需添加,添加的话会多出一个空行)。
man sed 信息:
Append text, which has each embedded newline preceded by a backslash.
例如:
4 行之后添加一行:
sed -e \’4 a newline\’ testfile
4 行之后追加 2 行:
sed -e \’4 a newline\\nnewline2\’ testfile
4 行之后追加 3 行(2 行文字和 1 行空行)
sed -e \’4 a newline\\nnewline2\\n\’ testfile
4 行之后追加 1 行空行:
#错误:sed -e \’4 a \\n\’ testfile
sed -e \’4 a \\ \’ testfile 实际上
2
实际上是插入了一个含有一个空格的行,插入一个完全为空的空行没有找到方法(不过应该没有这个需求吧,都要插入行了插入空行干嘛呢?)
添加空行:
# 可以添加一个完全为空的空行
sed \’4 a \\\\\’
# 可以添加两个完全为空的空行
sed \’4 a \\\\n\’
grep
Linux grep 命令用于查找文件里符合条件的字符串。
grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
语法
grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][–help][范本样式][文件或目录…]
参数:
-a 或 –text : 不要忽略二进制的数据。
-A<显示行数> 或 –after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-b 或 –byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
-B<显示行数> 或 –before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
-c 或 –count : 计算符合样式的列数。
-C<显示行数> 或 –context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
-d <动作> 或 –directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式> 或 –regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
-E 或 –extended-regexp : 将样式为延伸的正则表达式来使用。
-f<规则文件> 或 –file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-F 或 –fixed-regexp : 将样式视为固定字符串的列表。
-G 或 –basic-regexp : 将样式视为普通的表示法来使用。
-h 或 –no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
-H 或 –with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
-i 或 –ignore-case : 忽略字符大小写的差别。
-l 或 –file-with-matches : 列出文件内容符合指定的样式的文件名称。
-L 或 –files-without-match : 列出文件内容不符合指定的样式的文件名称。
-n 或 –line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
-o 或 –only-matching : 只显示匹配PATTERN 部分。
-q 或 –quiet或–silent : 不显示任何信息。
-r 或 –recursive : 此参数的效果和指定\”-d recurse\”参数相同。
-s 或 –no-messages : 不显示错误信息。
-v 或 –revert-match : 显示不包含匹配文本的所有行。
-V 或 –version : 显示版本信息。
-w 或 –word-regexp : 只显示全字符合的列。
-x –line-regexp : 只显示全列符合的列。
-y : 此参数的效果和指定\”-i\”参数相同。
实例
1、在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:
grep test *file
结果如下所示:
$ grep test test* #查找前缀有“test”的文件包含“test”字符串的文件
testfile1:This a Linux testfile! #列出testfile1 文件中包含test字符的行
testfile_2:This is a linux testfile! #列出testfile_2 文件中包含test字符的行
testfile_2:Linux test #列出testfile_2 文件中包含test字符的行
4
2、以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串\”update\”的文件,并打印出该字符串所在行的内容,使用的命令为:
grep -r update /etc/acpi
输出结果如下:
$ grep -r update /etc/acpi #以递归的方式查找“etc/acpi”
#下包含“update”的文件
/etc/acpi/ac.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.)
Rather than
/etc/acpi/resume.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of
IO.) Rather than
/etc/acpi/events/thinkpad-cmos:action=/usr/sbin/thinkpad-keys–update
3、反向查找。前面各个例子是查找并打印出符合条件的行,通过\”-v\”参数可以打印出不符合条件行的内容。
查找文件名中包含 test 的文件中不包含test 的行,此时,使用的命令为:
grep -v test *test*
结果如下所示:
$ grep-v test* #查找文件名中包含test 的文件中不包含test 的行
testfile1:helLinux!
testfile1:Linis a free Unix-type operating system.
testfile1:Lin
testfile_1:HELLO LINUX!
testfile_1:LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM.
testfile_1:THIS IS A LINUX TESTFILE!
testfile_2:HELLO LINUX!
testfile_2:Linux is a free unix-type opterating system.
————————————————
版权声明:本文为CSDN博主「Hi丶ImViper」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43314519/article/details/10693467