一.快捷键、通配符、特殊符号

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 环境及命令的更多相关文章

  1. shell及脚本4——shell script

    一.格式 1.1 开头 必须以 "# !/bin/bash"  开头,告诉系统这是一个bash shell脚本.注意#与!中间有空格. 二.语法 2.1 数值运算 可以用decla ...

  2. Shell脚本字符串匹配及日常命令工具 - 用法总结(技巧指南)

    Shell提供了很多字符串和文件处理的命令,如awk.expr.grep.sed等命令,还有文件的排序.合并和分割等一系列的操作命令.下面重点总结下Shell字符串处理.文本处理以及各类命令及函数用法 ...

  3. shell 编程 && bash 简介(shell 变量、shell操作环境、数据流重导向、管线命令、shell script)

    如何学习一门编程语言 数据类型 运算符 关键字 1 认识BASH 这个shell linux是操作系统核心,用户通过shell与核心进行沟通,达到我们想要的目的.硬件.核心.用户之间的关系: 原理:所 ...

  4. Linux Shell脚本入门--cut命令

    Linux Shell脚本入门--cut命令 cut cut 命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields &l ...

  5. shell脚本编程-使用结构化命令(if/else)(转)

    11.1 使用if-then语句 格式如下 if语句会执行if行定义的那个命令,如果该命令的退出状态码是0,则then部分的语句就会执行,其他值,则不会   1 2 3 4 if command th ...

  6. shell脚本中判断上一个命令是否执行成功

    shell脚本中判断上一个命令是否执行成功 shell中使用符号“$?”来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败.结合if-else语句实现判断上一个命令是否执行成功. 示例 ...

  7. Linux Shell脚本入门--wget 命令用法详解

    Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...

  8. linux shell 脚本攻略学习20--awk命令入门详解

    awk生于1977年,创始人有三个,分别为 Alfred Aho,Peter Weinberger, 和 Brian Kernighan,名称源于三个创始人的姓的首字母. 作用:处理文本文件. awk ...

  9. centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课

    centos  shell脚本编程2 if 判断  case判断   shell脚本中的循环  for   while   shell中的函数  break  continue  test 命令   ...

随机推荐

  1. Android Studio的SVN Performing VCS Refresh/Commit 长时间不结束

    给Android Studio项目里面的一个文件改名以后,再提交SVN时总是提示冲突,没办法解决.再后来不知道怎么弄的,每次提交时停留在SVN Performing VCS Refresh始终都不会完 ...

  2. Struts+Spring+Hibernate项目的启动线程

    在Java Web项目中,经常要在项目开始运行时启动一个线程,每隔一定的时间就运行一定的代码,比如扫描数据库的变化等等.要实现这个功能,可以现在web.xml文件中定义一个Listener,然后在这个 ...

  3. Asp.Net MVC 从数据库生成代码(包括页面)

    项目需要,数据库已经设计完成,需要生成相关的数据访问代码和页面. 参考:http://www.tracefact.net/asp-net/aspnetmvc-model-part1.aspx http ...

  4. java抽象类和接口

    面向对象设计过程中重要的一点是如何进行抽象,即把"问题空间"中的元素与"方案空间"中的元素建立理想的一对一的映射关系.抽象类和接口便是抽象过程中的产物.     ...

  5. 苹果手机不支持click文字 需要添加 cursor:pointer 才能 识别可以点击

    给一个div 绑定一个 click事件,  苹果手机会识别不了,必须添加一个 cursor:pointer 才能 识别可以点击.安卓正常识别.

  6. 简单的学习心得:网易云课堂Android开发第五章SharedPreferences与文件管理

    一.SharedPreferences (1)SharedPreferences能够用来保存一些属于基本数据类型的数据. (2)保存数据,删除数据都是由SharedPreferences的内部接口Ed ...

  7. Android中的自定义控件(一)

    自定义控件是根据自己的需要自己来编写控件.安卓自带的控件有时候无法满足你的需求,这种时候,我们只能去自己去实现适合项目的控件.同时,安卓也允许你去继承已经存在的控件或者实现你自己的控件以便优化界面和创 ...

  8. IOS 杂笔-9 (MD5 加密)

    首先是一段对MD5的简介 *出自一位大牛之手* Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护 ...

  9. Java之this关键字的用法

    Java 中的 this 关键字指当前的对象,可以直接用其调用当前对象的成员变量,也可以直接用其调用当前对象的成员方法,这是我们常见的场景,那么有没有其它的情况呢! this 还可以在无参的构造方法中 ...

  10. pip安装指定版本的package

    起因 最近到一个项目组,用了一套高大上的运维工具来搭建开发环境. 有vagrant控制VirtualBox启动虚拟机.有ansible来运行playbook初始化环境. 然后遇到了一个坑,项目现有的p ...