shell及脚本2——shell 环境及命令

it2022-05-05  291

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

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 2>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 2>>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 2> /dev/null // /dev/null垃圾桶,能吃掉任何导入到此设备的信息

特殊需求:把stdout和stderr都输出到同一文件中

>out_file 2>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' 2:drwxr-xr-x 2 root root 4.0K 12月 24 21:26 bin 18:drwxr-xr-x 2 root root 12K 12月 24 21:26 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:105:65534::/nonexistent:/bin/false avahi-autoipd:x:110:119:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false avahi:x:111:120:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false backup:x:34:34:backup:/var/backups:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin colord:x:113:123:colord colour management daemon,,,:/var/lib/colord:/bin/false ...... liuwanpeng@liuwanpeng-virtual-machine:/$ cat /etc/passwd | sort -t ':' -k 3  #:分隔后的第三个段排序,默认字符 root:x:0:0:root:/root:/bin/bash liuwanpeng:x:1000:1000:liuwanpeng,,,:/home/liuwanpeng:/bin/bash systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false usbmux:x:120:46:usbmux daemon,,,:/var/lib/usbmux:/bin/false ...... liuwanpeng@liuwanpeng-virtual-machine:/$ cat /etc/passwd | sort -t ':' -k 3 -n  #:分隔后的第三个段排序,按数字排序 root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin ......

 

(2).wc:数数字,多少字,多少行,多少字符

wc [-lwm]

-l:列出行数

w:列出多少字(英文单子)

m:多少字符

:/$ cat /etc/passwd |wc 45 74 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 3 /etc/passwd /etc/shadow ==> /etc/passwd <== root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin ==> /etc/shadow <== root:!:17159:0:99999:7::: daemon:*:16911:0:99999:7::: bin:*:16911:0:99999:7::: :~$ sudo join -t ':' -1 3 -2 4 /etc/passwd /etc/shadow 0:root:x:0:root:/root:/bin/bash:root:!:17159:99999:7:::    #第2个文件的第4个元素不显示了 0:root:x:0:root:/root:/bin/bash:daemon:*:16911:99999:7::: 0:root:x:0:root:/root:/bin/bash:bin:*:16911:99999:7:::

 

(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 3 root:x:0:0:root:/root:/bin/bash root:!:17159:0:99999:7::: daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin daemon:*:16911:0:99999:7::: bin:x:2:2:bin:/bin:/usr/sbin/nologin bin:*:16911:0:99999:7::: liuwanpeng@liuwanpeng-virtual-machine:~$ sudo cat /etc/group |sudo paste /etc/passwd /etc/shadow - | head -n 3 root:x:0:0:root:/root:/bin/bash root:!:17159:0:99999:7::: root:x:0: daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin daemon:*:16911:0:99999:7::: daemon:x:1: bin:x:2:2:bin:/bin:/usr/sbin/nologin bin:*:16911:0:99999:7::: bin:x:2:

 

(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-- 1 liuwanpeng liuwanpeng 3.3M 12月 27 16:08 uImage -rw-rw-r-- 1 liuwanpeng liuwanpeng 1.0M 12月 27 16:09 uImageaa -rw-rw-r-- 1 liuwanpeng liuwanpeng 1.0M 12月 27 16:09 uImageab -rw-rw-r-- 1 liuwanpeng liuwanpeng 1.0M 12月 27 16:09 uImageac -rw-rw-r-- 1 liuwanpeng liuwanpeng 239K 12月 27 16:09 uImagead -rw-rw-r-- 1 liuwanpeng liuwanpeng 3.3M 12月 27 16:11 uImage_new    #与uImage大小一样

 

7.参数代换:xargs

产生命令的参数,而不是产生命令的输入,用例子说明最明白

:~/test$ ls  #两个文件 file1 file2:~/test$ cat file1 file2 #两个文件的内容this is file 1this 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 2 ./file1:this is file 1:~/test$  grep 'this' file1 file2  #使用xargs后相当于此命令file1:this is file 1file2:this is file 2

 

8.减号-的作用

替代stdout或者stdin

tar -cvf - /home | tar -xvf -    #第一个减号,表示tar包不存到文件,而是存到stdout                     #管道把第一个命令的stdout(tar包)转化为第二个命令的stdin #第二个-号表示解压stdin

 

转载于:https://www.cnblogs.com/liuwanpeng/p/6203784.html


最新回复(0)