shell命令学习

 

一.shell命令行:
1.man 
帮助手册,例man man列出man命令的解释,列出的是全部的模块
man (1-9) intro 阅读具体的部分(看左上角数字)
info help命令也有类似的手册


2.cd
切换目录,例cd / 切换到根目录,直接输入cd,回车,切换到主目录
绝对路径总是以/开头,加上路径
相对路径不以/开头,直接跟着需要切换至的路径


3.pwd
显示当前所处位置


4.ls
列出当前目录下的文件和目录(按列以字母排序,不会区分文件还是目录)
加上参数-F,ls -F,显示的结果会区分目录还是文件(不会显示隐藏文件),会在可执行的文件后加上*
加上参数-a,ls -a,显示所有的文件,当然也包含隐藏文件(以.开头)
加上参数-R,ls -R,递归显示当前所有的目录文件(如果文件目录级别深,建议不要使用)
ls -FR
加上参数-l,ls -l,显示每个文件的附件信息,类型,权限,所属用户等
ls -alF
过滤输出,关键字查询(正则表达式)
ls -l *.log
ls -ltr 按时间排序

5.touch
创建空文件,touch file
ls -l file
touch还可改变文件的修改时间
touch file改变文件file的修改时间,不修改文件内容
加上参数-a,改变文件的访问时间
touch -a file
查看文件的访问时间,需加上参数 --time=atime


6.cp
复制文件,cp file  file1 / 复制file文件至根目录,并命名为file1
加上参数-i,如果存在相同名称文件会提示是否覆盖
cp -R file . 递归复制整个目录的内容


7.ln
链接文件,ln -s data s_data(软链接,出来的文件是独立文件),ln data s1_data(硬链接,同个文件)
查看文件的indo编号,ls -i data


8.mv
重命名文件,mv file file1,将文件file重命名为file1
移动文件,mv file /,将file文件移动至根目录(加上参数-i,如果存在相同名称文件会提示是否覆盖)


9.rm
删除文件,rm -i file,删除文件file,加提示,如果不需提示,可使用参数-f,rm -f file
如果需要删除文件夹,rm -rf file/


10.mkdir 
创建目录,mkdir dir,创建dir/目录
ls -ld dir 
mkdir -p new_dir/dir/test,创建多级目录
tree new_dir,以树杈的形式展示目录结构
11.file
file file查看文件file的类型


12.cat
显示文件中所有的数据,cat file
加上参数-n,显示行数
加上参数-b,显示非空行的行数
加上参数-T,以非制表符显示


13.more
显示文本内容,以页的形式


14.less
more的增强版


15.tail
默认显示文本的最后10行
tail -f log,动态监测日志
tail -n 2 log,显示最后的3行


16.head
默认显示文本的前10行
head -n 2 log,显示前2行


17.ps 
显示当前用户的进程
ps -ef
ps --forest 显示进程的层级信息


18.top
实时监控进程信息


19.kill
结束进程,kill -9 PID,结束进程号为PID的进程
killall java,结束所有的java进程


20.mount
挂载设备,mount -t type device directory
mount -t vfat /dev/sdb1 /media/disk,手动将类型为vfat的U盘的/dev/sdb1挂载到目录/media/disk上


21.umount
卸载设备,umount /dev/sdb1


22.df 
显示磁盘空间,df -h 
显示剩余inode,df -i


23.du
显示当前目录下的所有文件,目录,子目录的磁盘使用,du -sh . |sort -n | head -n 5


24.sort
sort -n,把数字识别为数字并排序
sort -M,按月排序
sort -t ':' -k 3 -n /etc/password,以第3个:后的数字进行排序
和上述类似的命令:cat /etc/passwd |awk -F ':' '{print $3}' |sort -n
du -sh / | sort -n | head -n 10,查找根目录下磁盘占用前10的文件 


25.grep
搜索文件,grep three file,在文件file中查找three
grep -C 200 'three' file ->1.txt,在文件file中查找three并将结果导出至文件1.txt
加上参数-v,取反搜索,grep -v t file,查找文件file中不包含t的行
加上参数-n,显示行数
加上参数-c,得到匹配的总行数
加上参数-e,指定多个模式,grep -e t -e f file,查找文件file中包含t或e的行------grep [tf] file


26.gzip
压缩文件,gzip file
解压文件,gunzip file.zip


27.tar
压缩文件,tar -zcvf file.tar file
解压文件,tar -zxvf file.tar
-c 创建新的tar归档
-x 从tar归档中提取文件
-t 列出tar归档中的内容,但不解压


28.date
echo $(date) -----date得到当前系统时间
echo $(date +%Y-%m-%d) -----date +%Y-%m-%d格式化当前时间:2018-01-02
echo $(date -d 'yesterday'+%Y-%m-%d) -----date -d 'yesterday'+%Y-%m-%d格式化当前时间前一天:2018-01-01
date命令的常见使用方法总结 
由于跨年、跨月、闰平年等特殊性,在日常编程过程中对日期的处理总是异常麻烦。目前,各种编程语言也都要自己的日期函数库,所以在对日期进行处理前,一定先查查你使用的编程语言有没有日期函数库。使用shell编程时,对于日期的使用也总是会或多或少出现在程序中:输出程序处理时间,处理几天前的文件,……
在shell中date命令可以来达到我们的需求,在这里对其常见使用方法进行总结(关于date命令的具体说明可以man date或者date --help,这里只总结常见用法)。
先看看date的选项:
选项:
-d datestr  | --date=datestr: 显示 datestr 中所设定的时间 (非系统时间)
–help : 显示辅助讯息
-s datestr  |  --set=datestr: 将系统时间设为 datestr 中所设定的时间
-u | --utc | --universal: 显示目前的格林威治时间
–version : 显示版本编号
其中-d和-s最常使用。
1.) 获取当前时间戳
date "+%s"          #从1970年1月1日00:00:00到当前的秒数
2.) 获取当前日期
date "+%Y-%m-%d"    #格式串中不能有空白,如有,请将格式串整体放在双引号内
默认情况下,在显示日期和时间时,date命令使用数字0填充数字域。例如,如果用两位数字显示月份,则6月显示为“06”,也可以用下述控制符来控制填充符号。
短线(-):表示不填充数字域。
下划线(_):表示用空格填充数字域。
例如,命令“date +%d/%m”的输出为“02/01”;命令“date +%-d/%-m”的输出为“2/1”;命令“date +%_d/%_m”的输出为“ 1/ 5”。
3.) 获得相对日期
相对日期相对当前日期而言。d 选项还可以告诉您,相对于当前日期若干天的究竟是哪一天,从现在开始的若干天或若干星期以后,或者以前(过去)。通过将这个相对偏移使用引号括起来,作为 -d 选项的参数,就可以完成这项任务。
例如,您需要了解两星期以后的日期。如果您处于 Shell 提示符处,那么可以迅速地得到答案:
       $ date -d ’2 weeks’
关于使用该命令,还有其他一些重要的方法:
使用 next/last指令,您可以得到以后的星期几是哪一天:
       $ date -d ‘next monday’ (下个月当前的日期)
$ date -d next-day +%Y%m%d(明天的日期)或者:date -d tomorrow +%Y%m%d
$ date -d “20110321 next-day” +%Y%m%d(20110321后一天的日期)
$ date -d last-day +%Y%m%d(昨天的日期) 或者:date -d yesterday +%Y%m%d
$ date -d last-month +%Y%m(上个月是几月)
$ date -d next-month +%Y%m(下个月是几月)
使用 ago 指令,您可以得到过去的日期:
$ date -d ’30 days ago’ (30天前的日期)
您可以使用负数以得到相反的日期:
$ date -d ‘dec 14 -2 weeks’ (相对:dec 14这个日期的两周前的日期)
$ date -d ‘-100 days’ (100天以前的日期)
$ date -d ’50 days’(50天后的日期)
4.) 日期转时间戳
date -d | --date= ‘yyyy-mm-dd hh:mi:ss’ +%s (日期格式为yyyy-mm-dd hh:mi:ss)
如:date --date="2010-12-03" "+%s"   #--date后面接需要转换的日期
5.) 时间戳转日期
date -d ’1970-01-01 UTC time seconds’ +”%Y-%m-%d %T %z” (time为时间戳)
如:date --date="1970-01-01 UTC  1291363421 seconds" "+%Y-%m-%d"
date date --date="@1291363421" 竟然也行!!
6.) 日期比较大小
(1)比较日期先后最简单的方法就是直接对日期的字符串进行比较。例如:
if [ "2010-12-31" \< "2011-01-01" ]   #注意小于号的转义
if [[ "2010-12-31" < "2011-01-01" ]]  #此时不需要转义
(2)如果觉得(1)的方法不靠谱,那么也可以把日期先转换为时间戳,再进行时间戳的对比。  
stamp1=`date --date=$date1 +%s`
stamp2=`date --date=$date2 +%s`
stamp=`expr $stamp2 - $stamp1`
echo $stamp
if [ $stamp -gt 0 ]   #大于0
7.) 获取指定日期的相对时间
$date -d "20110321 +2 days" (相对20110321两天后) 
$date -d "20110321 +2 weeks" (相对20110321两周后)
这两种方式在较早的操作系统中(如RedHat 4U7)可能不支持,需使用next/last指令。 


29.xargs
格式化输出文本
cat test.txt|xargs -n3 每行3个
xargs -d界定符 定义界定符
如: xargs -dX 以X为界定符
echo 'nameXnXn' | xargs -dX 输出namenn
和find命令一起使用:find . -type f -print|xargs grep 'xx' >zc.txt


30.chmod
权限管理 chmod u+x 1.txt
u表示目录或文件的当前的用户
g表示目录或文件的当前群组
o表示除目录或文件的当前用户或群组外的用户或群组
a表示所有的用户或群组
用法如下:
chmod 字符/数字 文件名
例:chmod u+rwx(u+777)1.txt
字符: r读权限,数字4表示
w写权限,数字2表示
x执行权限,数字1表示
-删除赋权的权限,数字0表示


31.chgrp 改变目录与文件的所属群组
chgrp [选项] [组] [文件]
chgrp -v bin 1.log 将文件1.log的所属群组更改为bin


32.chown 改变文件的拥有者为指定的用户或组
chown mail:mail 1.log 将1.log文件的拥有者和群组更改为mail


33.free 显示当前linux系统中空闲的,已用的物理内存及swap内存,被内核使用的buffer
free -m
vmstat 可对操作系统的虚拟内存、进程、CPU活动进行监控
iostat 对操作系统的磁盘进行监控
netstat(类似ss) 用于显示与IP、TCP、UDP和ICMP协议相关的统计数据
lsof(list open files)是一个列出当前系统打开文件的工具


34.ifconfig 获取网络接口配置信息
使用ssh secure shell client时需可使用此命令查看地址 inet addr:
linux系统和SSH Secure Shell Client使用windows环境必须在同一网络(局域网),
如果使用的是虚拟机,则虚拟机的网络必须配置为桥接模式


35.ping 确认网络和外部主机的状态
ping 127.0.0.1 使用ctrl+c中断 
ping -c 5 127.0.0.1
traceroute指令让你追踪网络数据包的路由途径,预设数据包大小是40Bytes,用户可另行设置


36.telnet 远程访问服务器的状态和端口是否可访问
telnet 127.0.0.1 8080
若远程服务器无法访问:
处理这种情况方法:
(1)确认ip地址是否正确?
(2)确认ip地址对应的主机是否已经开机?
(3)如果主机已经启动,确认路由设置是否设置正确?(使用route命令查看)
(4)如果主机已经启动,确认主机上是否开启了telnet服务?(使用netstat命令查看,TCP的23端口是否有LISTEN状态的行)
(5)如果主机已经启动telnet服务,确认防火墙是否放开了23端口的访问?(使用iptables-save查看)
若域名无法解析:
处理这种情况方法:
(1)确认域名是否正确
(2)确认本机的域名解析有关的设置是否正确(/etc/resolv.conf中nameserver的设置是否正确,如果没有,可以使用nameserver 8.8.8.8)
(3)确认防火墙是否放开了UDP53端口的访问(DNS使用UDP协议,端口53,使用iptables-save查看)


37.rcp 用于计算机之间的拷贝
rcp test1 webserver1:/home/root/test 将test拷贝至webserver1下/home/root/test
scp -r 09 webserver1:/home/root/test(scp是rcp的加强版)


38.diff 用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方
 diff log2014.log log2013.log  -y -W 50 并排格式输出
 说明:
“|”表示前后2个文件内容有不同
“<”表示后面文件比前面文件少了1行内容
“>”表示后面文件比前面文件多了1行内容


39.cal 显示当前月份日历
cal 9 2017 显示指定月份的日历


40.watch 查看命令的执行情况
watch -n 1 -d netstat -ant 每隔一秒高亮显示网络链接数的变化
watch -n 1 -d 'pstree|grep http' 每隔一秒高亮显示http链接数的变化
watch -n 10 'cat /proc/loadavg' 10秒一次输出系统的平均负载


41.crontab 定时任务
crontab -l
minute hour day month week command
备份crontab命令,crontab -l > /$HMOE/mycron
还原:crontab <filename>


42.awk 文本分析工具,把文件逐行的读入,以空格或tab键为默认分隔符将每行切片,切开的部分再进行各种分析处理
awk '{pattern + action}' {filenames}(使用BEGIN来显示或初始化变量,END输出最终结果)
awk的3种调用方法:
1.)命令行方式:
awk [-F field-separator] 'commands' input-file(s)
命令中的commands是真正的awk命令,[-F域分隔符]可选,input-file(s)是待处理的文件
last -n 5 | awk  '{print $1}' ->zc.txt 将最近5个登录的用户名写入zc.txt文件中
$1表是第一列,$n表示n列,默认分隔域符以空格键或tab键分隔
2.)shell脚本方式:
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh
可以换成:#!/bin/awk
#!/bin/usr/bash
pwd
cat /etc/passwd |
awk -F ':' '{print "name,shell"} {print $1","$7} END {print "END"}'|
head -n 10
3.)将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
cat /etc/passwd |awk -F ':' '{print $3}' |sort -n
和上述类似的命令:sort -t ':' -k 3 -n /etc/passwd
4.)支持关键字搜索:
awk -F: '/正则表达式/' /etc/passwd
awk -F: '/root/' /etc/passwd
awk有许多内置变量用来设置环境信息:
ARGC               命令行参数个数
ARGV               命令行参数排列
ENVIRON            支持队列中系统环境变量的使用
FILENAME           awk浏览的文件名
FNR                浏览文件的记录数
FS                 设置输入域分隔符,等价于命令行 -F选项
NF                 浏览记录的域的个数
NR                 已读的记录数
OFS                输出域分隔符
ORS                输出记录分隔符
RS                 控制记录分隔符
例:
awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
如果以M为单位显示文件的字节数:
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}' 
5.)条件语句
 awk中的条件语句是从C语言中借鉴来的,见如下声明方式:
复制代码
if (expression) {
    statement;
    statement;
    ... ...
}


if (expression) {
    statement;
} else {
    statement2;
}


if (expression) {
    statement1;
} else if (expression1) {
    statement2;
} else {
    statement3;
}
6.)数组
awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd


43.curl 文件传输工具
curl https://www.baidu.com -o filename.iso --progress 
将下载的内容写入filename.iso文件中,并显示进度条


44.sed
sed [option] 'sed command' filename
sed [option] -f 'sed script' filename
option:
-n 打印匹配的行
-e 多点编辑 sed -e '1,3d' -e 's/test1/test2/g' filename 先删除1-3行,再将剩余行中test1替换为test2
-i 文件会改为输出至屏幕的内容
sed -i '/hello/s@End@tail@' filename @表示地址定界符,可以为/,$,#等特殊字符,此命令表示,匹配hello字符
的行,把End替换为tail(默认修改每行的第一个)
'sed command':
p 打印匹配行只屏幕
s 替换 sed 's/data1/data2/g' filename 替换filename中所有的data1为data2(加了g,如果没有g就是替换每行第一个匹配的)
sed 's/data1/data2/p' 打印替换filename中每行首个被替换的所有的data1为data2的行
sed 's/^/Start /' filename 在每行的开头加上Start
sed 's/$/ End/' filename 在每行的结尾加上End
d 删除 sed '2,$d'filename 删除2至最后的所有行
sed '2/test/$d' filename 删除2至最后行中匹配的行
r 读取 sed '/test/r file' filename 将file中的内容读出,显示在filename中匹配到test的行下面,如果匹配多行,则将file中的内容都显示在所有匹配行的下面
w 写入 sed '/test/w file' filename 将filename中匹配到test行写入到file中
a 追加 sed '/^test/a//--->this is new line' filename 将'this is new line'追加到filename文件中以test开头的行后面
sed '/are/a nihao' filename(sed '/are/a\nihao' filename) 在filename中匹配到are的下一行添加ninhao
i 插入 sed'/are/i nihao' filename(sed '/are/i\nihao' filename) 在文件filename中匹配到are的前一行加上nihao
n 下一行sed '/test/{n;s/aa/bb/;}' filename 将filename中匹配到test的下一行中aa替换为bb,并打印,然后继续
y 变形 sed '1,5y/abc/ABC' filename 将filename中1-5行中的abc换为ABC
q 退出 sed'1,10q' filename 打印完第10行就退出sed
h,G 保持和获取 sed -e '/test/h' -e '$G' filename 将filename中匹配到test行追加至filename中的尾部
h,x 保持和互换 sed -e '/test/h' -e '/check/x' filename 将filename中的test行和包含check行互换
Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,
要用分号分隔。以#开头的行为注释行,且不能跨行
比如,如果要打印出含有字串”1024”的行,我就可能会用:
cat filename | sed –n ‘/1024/p’
sed /^$/d filename
可以删除文件中的空行。
sed /^[[:space:]]*$/d filename
可以删除内容为多个空格/tab组成的行
sed -e  s'/^[^0-9a-zA-Z]*[0-9]\{1,\}://g' tmp
将tmp中以非空字符且数字开始,后面接冒号的替换掉,其中\表示转义{1,}表示1次以上
sed 's/linux/jie &/' filename 在filename文件中匹配到linux的前面加上jie
sed 's/linux/& jie/' filename 在filename文件中匹配到linux的后面加上jie
sed '/linux/s/$/ you' filename 在filename文件中匹配到linux的行的行尾加上you
sed '/you/s/\(.*\)/\1 Li/g' filename 用正则表达式,\(\)表示分组,\1表示选择组1,
.*表示任意字符,在匹配到的行尾加上you
cat filename|sed -e 's/http:\/\///' -e 's/\/.*//' |sort | uniq -c | sort -rn 提取网址
awk -F/ '{print $3}' file |sort -r|uniq -c|awk '{print $1"\t",$2}' 提取网址
ifconfig | grep -B1 "inet addr" |grep -v "\-\-" |sed -n -e 'N;s/eth[0−9].*\n.*addr:[0−9]{1,3}\.[0−9]{1,3}\.[0−9]{1,3}\.[0−9]{1,3}.*/\1 \2/p'  网卡ip


45.uniq 重复行
首先比较相邻的行,然后除去第二行和该行的后续副本。重复的行一定相邻。(在发出 uniq 命令之前,请使用 sort 命令使所有重复行相邻。)
sort filename|uniq -c 显示重复次数
sort filename|uniq -d 只显示重复行
sort filename|uniq -u 只显示不重复行


46.echo
一直觉得echo没参数,经常作为输出
-n 不换行输出


47.test命令是shell环境中测试条件表达式的实用工具
-b<文件>:如果文件为一个块特殊文件,则为真;
-c<文件>:如果文件为一个字符特殊文件,则为真;
-d<文件>:如果文件为一个目录,则为真;
-e<文件>:如果文件存在,则为真;
-f<文件>:如果文件为一个普通文件,则为真;
-g<文件>:如果设置了文件的SGID位,则为真;
-G<文件>:如果文件存在且归该组所有,则为真;
-k<文件>:如果设置了文件的粘着位,则为真;
-O<文件>:如果文件存在并且归该用户所有,则为真;
-p<文件>:如果文件为一个命名管道,则为真;
-r<文件>:如果文件可读,则为真;
-s<文件>:如果文件的长度不为零,则为真;
-S<文件>:如果文件为一个套接字特殊文件,则为真;
-u<文件>:如果设置了文件的SUID位,则为真;
-w<文件>:如果文件可写,则为真;
-x<文件>:如果文件可执行,则为真。
例. 两个档案之间的比较,如: test file1 -nt file2
-nt (newer than)判断 file1 是否比 file2 新
-ot (older than)判断 file1 是否比 file2 旧
-ef 判断 file1 和 file2 是否为同一档案,可用在判断 hard link 的判断上。 
主要是在判断,两个档案是否均指向同一个 inode


例. 关于两个整数之间的比较,例如 test n1 -eq n2
-eq 两数值相等 (equal)
-ne 两数值不等 (not equal)
-gt n1 大于 n2 (greater than)
-lt n1 小于 n2 (less than)
-ge n1 大于等于 n2 (greater than or equal)
-le n1 小于等于 n2 (less than or equal)


例. 字符串判断
test -z string 判断字符串是否为空,为空返回true
test -n string 判断字符串是不为空,为空返回false


例. 多重条件判断,例如: test -r filename -a -x filename
-a (and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 不 x 权限时,才回传 true。
-o (or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有 r 戒 x 权限时,就可回传 true。
! 反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true


if test     #表达式为真
if test !   #表达式为假
test 表达式1 –a 表达式2     #两个表达式都为真
test 表达式1 –o 表达式2     #两个表达式有一个为真
test 表达式1 ! 表达式2       #条件求反
if test $num1 -eq $num2  判断num1和num2大小
例.用户输入一个文件名,我们判断:这个文件是否存在,若不存在则输出 "file not exist” ,并中断程序;若这个文件存在,则判断它是文件还是目录 ;最后判断这个文件的权限。
#!/bin/bash  
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin  
export PATH  
  
#让用户输入用户名  
echo -e "please input a filename "  
read -p "input a filename:" filename  
test -z $filename && echo "you must input a filename." && exit 0  
  
#判断文件是否存在  
test ! -e $filename && echo " file do not exist" && exit 0  
  
#开始判断文件类型  
test -f $filename && filetype="regulare file"  
test -d $filename && filetype="directory"  
test -r $filename && perm="readable"  
test -w $filename && perm="$perm writable"  
test -x $filename && perm="$perm executable"  
  
#开始输出信息  
echo "the filename:$filename is a $filetype"  
echo "and the permissions are :$perm"


48.ping 
ping -c 1 ip地址 ping地址1次


49.cut
查看文件内容,显示行中指定部分,删除文件中指定字段
该命令有两项功能,其一是用来显示文件的内容,它依次读取由参数file所指明的文件,
将它们的内容输出到标准输出上(配合more使用);其二是连接两个或多个文件,如cut fl f2 > f3将把文件fl和f2的内容合并起来,
然后通过输出重定向符“>”的作用,将它们放入文件f3中
cut (选项) (参数)
-b:仅显示行中指定直接范围的内容;
-c:仅显示行中指定范围的字符;
-d:指定字段的分隔符,默认的字段分隔符为“TAB”;
-f:显示指定字段的内容;
-n:与“-b”选项连用,不分割多字节字符;
--complement:补足被选择的字节、字符或字段;


cut -fn -d ";" filename 显示filename文件中的n列,以;为分隔符
cut -fn -d ";" --complement filename 显示filename文件中除n列外的内容,以;为分隔符


50.tr
对来自标准输入的字符进行替换、压缩和删除
tr '%' ' ' 用空格取代%
echo "thisssss is a textttt" |tr -s 'st' 将连续出现的重复字符删除,保留一个
echo aa.,a 1 b#$bb 2 c*/cc 3 ddd 4 | tr -d -c '0-9 \n' 字符集补集,从输入文本中将不是数字的字,空格,\n字符删除
echo 1 2 3 4 5 6 7 8 9 | xargs -n1 | echo $[ $(tr '\n' '+') 0 ](方括号用于算法运算)


51.if
shell中条件判断if中的-z到-d的意思 
[ -a FILE ] 如果 FILE 存在则为真。 
[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。 
[ -d FILE ] 如果 FILE 存在且是一个目录则为真。 
[ -e FILE ] 如果 FILE 存在则为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。 
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。 
[ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。 
[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。 
[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。 
[ -r FILE ] 如果 FILE 存在且是可读的则为真。 
[ -s FILE ] 如果 FILE 存在且大小不为0则为真。  
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。 
[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。 
[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。 
[ -x FILE ] 如果 FILE 存在且是可执行的则为真。 
[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。 
[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。 
[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。  
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。  
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2,or 如果 FILE1 exists and FILE2 does not则为真。  
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。  
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。 
[ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。 
[ -z STRING ] “STRING” 的长度为零则为真。  
[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真


52.read 和 IFS联合使用(分隔字符串时的功能和awk类似)
IFS= read -r x y z <<<"$str" 将str中的值赋值给x y z (以空格分隔)
IFS=- read -r x y z <<<"$str" 将str中的值赋值给x y z (以"-"分隔)
IFS=- read -ra part <<<"foo-bar-bza" 将分隔出的值赋值给part数组(-a 选项,使用${part[0]}来访问)
while IFS= read -rn1 c; do
    # do something with $c
done <<< "$str"(-n1参数,让read命令依次读入一个字符,类似地,-n2说明每次读入两个字符)

 

53.{}用法

echo {$var/foo/for} (参数展开,将var中的foo替换为for)

echo ${#var} (参数展开,获得var的长度)

子串提取操作的语法格式为${var:offset:length}
例:
str="hello world"
echo ${str:6}




二.理解shell
1.shell的类型
系统启动的shell类型取决于用户ID配置
/etc/password中的第7个参数
2.shell的父子关系
打开终端会创建个shell进程,此时启用的是系统默认的交互shell
此时如果再输入/bin;bash或/bin/bash,会创建一个新的shell程序,这个shell被称为子shell
ps --forest查看进程间的关系
3.进程列表
将一组命令放到()中,如(pwd; ls ; cd ..; pwd)是一个进程列表,生成一个子shell来执行命令
查看是否生成子shell,可在命令尾加上echo $BASH_SUBSHELL
如上的命令(pwd; ls ; cd ..; pwd; echo $BASH_SUBSHELL)会输出1,输出0表示未生成子shell
子shell也可以嵌套shell,如(pwd; ls ; cd ..; pwd; (echo $BASH_SUBSHELL))输出2
3.shell用法
1).探索后台模式:
sleep 100&,此命令进入后台运行100秒,使用ps -f查看
jobs可查看当前运行在后台模式的所有的进程
2).将进程列表置入后台
(sleep 10 ; echo $BASH_SUBSHELL ; sleep 10)&
常用的地方是tar
(tar -cf 1.tgz /home ;tar -cf 2.tgz /usr)&
3).协程
协程可以同时做两件事,后台生成一个shell,并在这个shell中执行命令,协程需要使用到coproc命令
coproc sleep 10
jobs 
coproc my_job { sleep 10; }(花括号前后有空格)
4.shell中的内建命令和外部命令
1).外部命令
一般外部命令是放在/bin,/usr/bin,/sbin,/usr/sbin中,执行时会创建shell进程
可以使用which,whereis,type查找命令的位置
2).内建命令
内建命令和外部命令的区别在于内建命令不需要使用字进程来执行命令
查看命令的不同实现,type -a echo
5.重定向
stdin(0),stdout(1),stderr(2)
command &>file,command >file 2>&1(重定向命令的 stdout 和 stder 到同一个文件中)
三.linux环境变量
1.全局变量和局部变量
1).全局变量对所有的会话和进程都可见,局部变量只对创建它的shell可见
查看全局变量:env,printenv
显示个别环境变量的值,使用printenv $HOME
2).无命令可单独查看局部变量,可使用set命令查看全局,局部,自定义的变量
3).自定义变量:
my_variable=hello(注意无引号时赋值,等号右边值无空格,否则报错)
如值中需要空格,my_variable="hello world"
四:shell脚本的语法
1.将命令行写入shell脚本中,加上BEGIN(初始化) ,END(结束) 
例:#!/bin/usr/bash
cat /etc/passwd |
awk -F ':' 'BEGIN {print "shell,name"} {print $1","$2} END {print "END"}'|
head -n 10 >>/ulic/adev/life.ulic.com/zc/`date +'%Y-%m-%d-%H-%M-%S'`.log
脚本说明:输出/etc/passwd文件中的一二列,并在开头加上shell,name,最后加上END,
取前10行,并将日志输出到以当前时间为名的文本中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值