shell及脚本2——shell 环境及命令
一.快捷键、通配符、特殊符号
1. 快捷键
CTRL+C:终止目前的命令
CTRL+D:输入结束,EOF
CTRL+M:ENTER
CTRL+S:暂停屏幕输出
CTRL+Q:恢复屏幕输出
CTRL+U:将整行命令删除
CTRL+Z:暂停目前的命令
2.通配符
* 任意多个字符
? 任意1个字符
[] 1个括号中的字符,例如[abcd]表示a/b/c/d中的任意1个
[-] 在编码顺序内的所有字符,例如[0-9]表示0,1,2,3,4,5,6,7,8,9所有这些数
[^] 反向选择,[^abc]表示只要不是a/b/c的字符
3.特殊符号
# 注释
\ 转移符
| 管道,分隔两个管道命令
; 连续命令分隔
~ 用户主文件夹 home/username
$ 变量前导符,使用变量时需要添加
& 后台工作
! 非
/ 目录
>,>> 数据流重定向,输出, >替换,>>累加
<,<< 数据流重定向,输入
' ' 单引号内的特殊符号失去特殊意义
" " 双引号内的特殊符号保留特殊意义
·· 反向单引号,可以执行命令
() 括号内为子shell
{} 命令块组合
二、数据流重定向
标准输出stdout:命令执行正确,输出的信息,一般默认为屏幕,代码为1,使用>或>>
错误输出stderr:命令执行错误,输出的信息,一般默认为屏幕,代码为2,使用2>或2>>
标准输入stdin:代码为0,使用<或<<
@ubuntu:~/test$ ls ./no_dir
ls: cannot access ./no_dir: No such file or directory
@ubuntu:~/test$ ls ./no_dir >ls_err // standard err 信息重定位到文件ls_err中,屏幕不再显示
@ubuntu:~/test$ cat ls_err // ls_err文件中保存了刚才的standard err信息
ls: cannot access ./no_dir: No such file or directory
@ubuntu:~/test$ ls ./no_dir >>ls_err // >>累加
@ubuntu:~/test$ cat ls_err
ls: cannot access ./no_dir: No such file or directory
ls: cannot access ./no_dir: No such file or directory
@ubuntu:~/test$ ls ./no_dir > /dev/null // /dev/null垃圾桶,能吃掉任何导入到此设备的信息
特殊需求:把stdout和stderr都输出到同一文件中
>out_file >out_file // 不对,stdout和stderr同时输出,out_file可能顺序混乱
>out_file 2>&1 // 正确, &1很关键,&表示1不是文件,而是stdou
三 命令执行顺序
cmd1 ; cmd2 // com1和com2顺序执行,没有条件
cmd1 && cmd2 // if(cmd1正确) cmd2
cmd1 || cmd2 // if(cmd1不正确) cmd2
&&和||的组合,一般遵循 cmd1 && cmd2 || cmd3, cmd1可能成功或失败,cmd2和cmd3一般都是成功的
*@ubuntu:~/test$ ls no_dir && echo "exist" || echo "not exit"
ls: cannot access no_dir: No such file or directory
not exit
*@ubuntu:~/test$ ls no_dir || echo "not exist" && echo "exit" // 与预期不符合,cmd2执行成功,cmd3也执行了
ls: cannot access no_dir: No such file or directory
not exist
exit
四 管道及管道命令
1.管道

前一个命令的stdout作为后一个命令的stdin,不是所有命令都能接收前一个命令的数据,例如ls,cp等就不行。
~$ ls /etc | less // ls /etc的stdout是一堆文件,这些信息作为less的stdin
2.选取命令:cut,grep
(1)cut:从一行数据中切出某一段
cut -d '分割字符' -f fields // 用-d后面的分隔符把一段信息分割成几段,然后用-f取出第几段
cut -c 字符范围 // 以字符范围取出固定个字符
:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
:~$ echo $PATH | cut -c 5- #从第5个字符取到结尾
/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
:~$ echo $PATH | cut -c 5-10 #取字符5-10
/local
:~$ echo $PATH | cut -d ':' -f 3 #以:为分隔符,取第3段
/usr/sbin
(2)grep:分析一行数据,如果有我们所需要的信息,就将该行拿出来。
grep [-acinv] [--color=auto] '查找字符串' filename
-a:将binary文件以text文件的方式查找数据
-c:计算'查找字符串'的次数
-i:忽略大小写
-n:输出行号
-v:反向选择
--color=auto:关键字加颜色显示
:/$ ls -lh / | grep -n 'bin'
:drwxr-xr-x root root .0K 12月 : bin
:drwxr-xr-x root root 12K 12月 : sbin
3.排序命令:sort,wc,uniq
(1).sort:排序,依据不同的数据类型排序
sort [-fbMnrtuk] [file or stdin]
-f:忽略大小写
-b:忽略最前面的空格
-M:以月份的名字排序
-n:使用纯数字排序,默认是文字类型
-r:反向排序
-u:uniq,相同的数据,仅列出1行
-t:分隔符,默认tab
-k:以哪个区间进行排序,一般与-t连用
:/$ cat /etc/passwd | sort #首字符排序
_apt:x::::/nonexistent:/bin/false
avahi-autoipd:x:::Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
avahi:x:::Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
backup:x:::backup:/var/backups:/usr/sbin/nologin
bin:x:::bin:/bin:/usr/sbin/nologin
colord:x:::colord colour management daemon,,,:/var/lib/colord:/bin/false
......
liuwanpeng@liuwanpeng-virtual-machine:/$ cat /etc/passwd | sort -t ':' -k 3 #:分隔后的第三个段排序,默认字符
root:x:0::root:/root:/bin/bash
liuwanpeng:x:1000::liuwanpeng,,,:/home/liuwanpeng:/bin/bash
systemd-timesync:x:::systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:::systemd Network Management,,,:/run/systemd/netif:/bin/false
usbmux:x:::usbmux daemon,,,:/var/lib/usbmux:/bin/false
......
liuwanpeng@liuwanpeng-virtual-machine:/$ cat /etc/passwd | sort -t ':' -k -n #:分隔后的第三个段排序,按数字排序
root:x:::root:/root:/bin/bash
daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
bin:x:::bin:/bin:/usr/sbin/nologin
......
(2).wc:数数字,多少字,多少行,多少字符
wc [-lwm]
-l:列出行数
w:列出多少字(英文单子)
m:多少字符
:/$ cat /etc/passwd |wc
2545 #45行 74字数 2545字符
(3).uniq:重复的数据仅显示1个
uniq [-ic]
-i:忽略大小写
-c:进行计数
4.双向重定向:tee

同时向stdout和file中存放结果
tee [-a] file
-a:累加方式
:~$ ls / | tee ~/ls_result #在屏幕显示结果的同时,将结果存入文件ls_result中
5.字符转换命令:tr,col,join,paste,expand
(1).tr:删除或替换一段信息中的文字,!只能等字符替换
tr [-ds] SET1 [SET2]
-d:删除SET1字符串
-s:替换掉重复的字符
:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:~$ echo $PATH | tr -d 'bin' #删除bin
/usr/local/s:/usr/local/:/usr/s:/usr/:/s:/:/usr/games:/usr/local/games:~$ echo $PATH | tr 'bin' 'bin_replace' #没达到效果,只能等字符替换
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:~$ echo $PATH | tr 'bin' 'replace'
/usr/local/srep:/usr/local/rep:/usr/srep:/usr/rep:/srep:/rep:/usr/games:/usr/local/games:~$ echo $PATH | tr 'bin' 'nib'
/usr/local/snib:/usr/local/nib:/usr/snib:/usr/nib:/snib:/nib:/usr/games:/usr/local/games
(2).col:
col [-xb]
-x:将TAB键换成对等的空格键
-b:文字中有反斜杠/时,只保留反斜杠最后接的那个字符
(3).join:将两个文件有相同数据的那一行加在一起,处理两个相关文件时比较有用
jion [-ti12] field1 field2
-t:分隔符,默认为空格,且默认对比第1个字符
-i:忽略大小写
-1:要用第一个文件的哪个字段比对
-2:要用第二个文件的哪个字段对比
:~$ sudo head -n /etc/passwd /etc/shadow
==> /etc/passwd <==
root:x:::root:/root:/bin/bash
daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
bin:x:::bin:/bin:/usr/sbin/nologin ==> /etc/shadow <==
root:!:::::::
daemon:*:::::::
bin:*:::::::
:~$ sudo join -t ':' - - /etc/passwd /etc/shadow
:root:x::root:/root:/bin/bash:root:!:::::: #第2个文件的第4个元素不显示了
:root:x::root:/root:/bin/bash:daemon:*::::::
:root:x::root:/root:/bin/bash:bin:*::::::
(4).paste:直接将两行粘贴到一起,中间用tab键隔开
paste [-d] file1 file2
-d:分隔符,默认是tab
-:如果file部分是-,表示标准输入stdin,可以理解成paste不能直接读取stdin,需要通过“-”把stdin转换成命令的输入文件
liuwanpeng@liuwanpeng-virtual-machine:~$ sudo paste /etc/passwd /etc/shadow | head -n
root:x:::root:/root:/bin/bash root:!:::::::
daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin daemon:*:::::::
bin:x:::bin:/bin:/usr/sbin/nologin bin:*::::::: liuwanpeng@liuwanpeng-virtual-machine:~$ sudo cat /etc/group |sudo paste /etc/passwd /etc/shadow - | head -n
root:x:::root:/root:/bin/bash root:!::::::: root:x::
daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin daemon:*::::::: daemon:x::
bin:x:::bin:/bin:/usr/sbin/nologin bin:*::::::: bin:x::
(5).expand:将tab键转换成空格键
expand [-t] file
-t:默认tab=8空格,也可以在-t后面加数字自己设置空格的数量
6.切割命令:split
把大文件依据文件大小或行数切割成小文件
split [-bl] file PREFIX
-b:文件大小,单位可用b、k、m
-l:以行数切割
:/work/platform-zynq/linux-xlnx-repo-smp/arch/arm/boot$ split -b 1m uImage uImage #切割:/work/platform-zynq/linux-xlnx-repo-smp/arch/arm/boot$ cat uImagea* >> uImage_new #合成新文件
:/work/platform-zynq/linux-xlnx-repo-smp/arch/arm/boot$ ls -lh
总用量 20M-rw-rw-r-- liuwanpeng liuwanpeng 3.3M 12月 : uImage
-rw-rw-r-- liuwanpeng liuwanpeng 1.0M 12月 : uImageaa
-rw-rw-r-- liuwanpeng liuwanpeng 1.0M 12月 : uImageab
-rw-rw-r-- liuwanpeng liuwanpeng 1.0M 12月 : uImageac
-rw-rw-r-- liuwanpeng liuwanpeng 239K 12月 : uImagead
-rw-rw-r-- liuwanpeng liuwanpeng 3.3M 12月 : uImage_new #与uImage大小一样
7.参数代换:xargs
产生命令的参数,而不是产生命令的输入,用例子说明最明白
:~/test$ ls #两个文件
file1 file2
:~/test$ cat file1 file2 #两个文件的内容
this is file 1
this is file 2
:~/test$ find -name "*"
.
./file2
./file1
:~/test$ find -name "*" |grep 'file' #在find命令的stdout信息中找file,能找到
./file2
./file1
:~/test$ find -name "*" |grep 'this' #在find命令的stdout信息中找this,肯定内有,因为this在文件的内容里:~/test$ find -name "*" |xargs grep 'this’ #把find找到的两个文件作为参数传给grep,grep在这两个文件里找this,找到了
grep: .: 是一个目录
./file2:this is file
./file1:this is file 1
:~/test$ grep 'this' file1 file2 #使用xargs后相当于此命令
file1:this is file 1
file2:this is file 2
8.减号-的作用
替代stdout或者stdin
tar -cvf - /home | tar -xvf - #第一个减号,表示tar包不存到文件,而是存到stdout
#管道把第一个命令的stdout(tar包)转化为第二个命令的stdin
#第二个-号表示解压stdin
shell及脚本2——shell 环境及命令的更多相关文章
- shell及脚本4——shell script
一.格式 1.1 开头 必须以 "# !/bin/bash" 开头,告诉系统这是一个bash shell脚本.注意#与!中间有空格. 二.语法 2.1 数值运算 可以用decla ...
- Shell脚本字符串匹配及日常命令工具 - 用法总结(技巧指南)
Shell提供了很多字符串和文件处理的命令,如awk.expr.grep.sed等命令,还有文件的排序.合并和分割等一系列的操作命令.下面重点总结下Shell字符串处理.文本处理以及各类命令及函数用法 ...
- shell 编程 && bash 简介(shell 变量、shell操作环境、数据流重导向、管线命令、shell script)
如何学习一门编程语言 数据类型 运算符 关键字 1 认识BASH 这个shell linux是操作系统核心,用户通过shell与核心进行沟通,达到我们想要的目的.硬件.核心.用户之间的关系: 原理:所 ...
- Linux Shell脚本入门--cut命令
Linux Shell脚本入门--cut命令 cut cut 命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields &l ...
- shell脚本编程-使用结构化命令(if/else)(转)
11.1 使用if-then语句 格式如下 if语句会执行if行定义的那个命令,如果该命令的退出状态码是0,则then部分的语句就会执行,其他值,则不会 1 2 3 4 if command th ...
- shell脚本中判断上一个命令是否执行成功
shell脚本中判断上一个命令是否执行成功 shell中使用符号“$?”来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败.结合if-else语句实现判断上一个命令是否执行成功. 示例 ...
- Linux Shell脚本入门--wget 命令用法详解
Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...
- linux shell 脚本攻略学习20--awk命令入门详解
awk生于1977年,创始人有三个,分别为 Alfred Aho,Peter Weinberger, 和 Brian Kernighan,名称源于三个创始人的姓的首字母. 作用:处理文本文件. awk ...
- centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课
centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 ...
随机推荐
- C#语音朗读文本 — TTS的实现
TTS, Text To Speech的缩写,是使用语音朗读文本的技术.目前,在国内应用较多的是排队叫号系统 Windows 平台的TTS,通常使用的是微软自带的 Speech API. Window ...
- ngrok
为什么要使用ngrok?/ngrok 作为一个Web开发者,我们有时候会需要临时地将一个本地的Web网站部署到外网,以供它人体验评价或协助调试等等,通常我们会这么做: 找到一台运行于外网的Web服务器 ...
- script标签中defer和async属性的区别
这篇文章来源于JS高级程序设计第三版中关于script标签的介绍,结合查阅的资料写下的学习笔记. 向html页面中插入javascript代码的主要方法就是通过script标签.其中包括两种形式,第一 ...
- 有了大量微信用户,就不需要App了吗?
小卢同学是我半年前在中关村车库咖啡认识的一个自由创业者,他从北航毕业后在一家IT上市公司只上了1年多的班就辞职创业了,他的创业项目属于国内度假旅游垂直细分领域:积累大量详细的旅游攻略,组成一个个温馨舒 ...
- Mac利用PD虚拟机安装Centos7
一.PD虚拟机的安装1.Parallels Desktop ,简称PD,号称是Mac上最好用的虚拟机,具体的就在此不进行过多描述.下附Mac .app文件夹下载,下载后放入/Applications/ ...
- 几款Git GUI客户端工具
工欲善其事,必先利其器. 作为一名开发人员,你不可能不知道git,无论你是开发自己的开源项目还是和团队一起进行大规模产品的开发,git都已经是源代码管理工具的首选.当然,那些hardcore deve ...
- Hibernate 系列 07 - Hibernate中Java对象的三种状态
引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...
- Webform(六)——登录状态保持(Cookies内置对象)
用户用浏览器访问一个网站,由于采用的http的特性,Web服务器并不能知道是哪一个用户正在访问,但一些网站,希望能够知道访问者的一些信息,例如是不是第一次访问,访问者上次访问时是否有未做完的工作,这次 ...
- SQL连接操作符介绍(循环嵌套, 哈希匹配和合并连接)
今天我将介绍在SQLServer 中的三种连接操作符类型,分别是:循环嵌套.哈希匹配和合并连接.主要对这三种连接的不同.复杂度用范例的形式一一介绍. 本文中使用了示例数据库AdventureWorks ...
- Redux状态管理方法与实例
状态管理是目前构建单页应用中不可或缺的一环,也是值得花时间学习的知识点.React官方推荐我们使用Redux来管理我们的React应用,同时也提供了Redux的文档来供我们学习,中文版地址为http: ...