Linux的shell编程前奏常见命令实战一
前言: linux中命令的一般形式为:命令 [参数] [路径文件]。参数其实就相当于面向对象语言java中的方法的重载一样,即我实现一个行为有多种方法,每一种方法都需要必要的工具条件,可以把这些参数想象成这些参数。路径文件就相当于做一件事情你要指向的目标。做运维的原则简单,易用高效。本文涉及到的shell编程基础命令有man,touch,ls,mkdir,cp,cd,rm,mv,echo,pwd,cat.alias,unalias,head,tail,tree,rmdir。中级命令有xargs,find,awk,sed,grep,vi,vim,seq。
1>创建一个目录/data,在/data下面建立一个文件oldboy.txt,为oldboy.txt文件增加内容"I am studying linux"
[root@lll3 /]# mkdir /data
[root@lll3 /]# cd /data;touch oldboy.txt ------建立文本文件:touch /data/oldboy.txt ;为多个命令的分隔符
[root@lll3 data]# echo "I amd studying linux" >> oldboy.txt ------标准输出重定向:echo相当于java中system.out.println(''I am studying linux''),>>的指向为数据流向
------单行文本覆盖:>指向为数据流向(数据朝着箭头的方向流动)
2>用一个命令在oldboy.txt中同时增加三行内容:
"I am studying java"
"I am studying php"
"I am studying shell"。
[root@lll3 data]# cat >>oldboy.txt<<EOF -----同时追加多行文本: cat>>文件名<<EOF
> I am studing java 追加的内容
> I am studying php EOF
> I am studying shell ----EOF为标签对标识,可以用其它的成对代替。
> EOF
总结: 重定向: <-----这个功能在linux里面是经常用到,实际上就是你看到的大于号小于号一样的东西
意思是将“数据传到其它地方”。将某个命令执行后本应该出现在屏幕上的数据,传输到其它地方。
执行命令时,这个命令可能会通过文件读入数据,经过处理之后,再将数据输出到屏幕。
>或1> 输出重定向: 把前面输出的东西输入到后面的文件中,会删除文件原有内容
>>或1>> 追加重定向: 把前面输出的东西追加到后面的文件中,不会删除文件原有内容
<或<0 输入重定向:输入重定向用于改变命令的输入,指定输入的内容,后跟文件名
<<或<<0 输入重定向: 后跟字符串,用来表示“输入结束”,也可用ctrl+d来结束输入
2> 错误重定向: 把错误信息输入到后面的文件中,会删除文件原有内容
2>> 错误追加重定向: 把错误信息输入到后面的文件中,不会删除文件原有内容
标准输入(stdin):代码为0,使用<或<<
标准输出(stdout): 代码为1,使用>或>>
标准错误(stderr):代码为2,使用2>或2>>
特殊:
2>&1 把标准错误重定向到标准输出
3>把oldboy.txt文件拷贝到/tmp下,把/data目录移动到/root下
[root@lll3 data]# cp oldboy.txt /tmp -----生产环境中一般先用cp命令拷贝备份一份,再删除;或者先用mv移动到/tmp下,然后等/tmp分区将要满时一次性删除
[root@lll3 data]# cd ..;mv /data /root/ -----..上级目录;.当前目录;-上一次目录;~家目录
4>进入root目录下的/data目录,删除oldboy.txt
[
root@lll3 /]# cd /root/data/;rm -fr oldboy.txt -----生产环境中一般先用cp命令拷贝备份一份,再删除
总结: 在脚本中删除文件或目录时生产环境的使用方法
A.和xargs搭配用法
find . -type f -mtime +15 |xargs rm -f ---删文件,15天以前
find . -type f -mtime +30 |xargs rm -fr ---删目录,30天以前
B.使用find的-exec
find /logs -type f -mtime +5 -exec rm {} \; ---在logs目录下查找更改时间在5日以前的文件并删除他们
----{}find找到的内容
---- -exec到\;都是参数
----;是bash特殊的意义,就用反斜线转义
---find常用参数-type;-size;-mtime;-name
5>已知文件oldboy.txt的内容为:
test
liyao
oldboy
请给出打印oldboy.txt内容时,不包含oldboy字符串的命令.
法一:
root@lll3 /]# mkdir data;touch /data/oldboy.txt;cd /data;cat>>oldboy.txt<<EOF
> test
> liyao
> oldboy
> EOF
[root@lll3 data]# grep -v oldboy oldboy.txt -----核心命令grep:过滤掉oldboy.txt中oldboy这个字符串,即显示除oldboy这行以外其它内容
test
liyao
总结:linux三剑客老三grep常用参数:-v是排除(按行)
法二:
[root@lll3 data]# head -2 oldboy.txt ----显示文件头部-n行数
test
liyao
法三:
[root@lll3 data]# sed /^oldboy/d oldboy.txt -----把以oldby开头的删除(按行删除),^是以什么开头
test
liyao
总结:linux三剑客老二sed常用参数:-n取消默认输出,p是打印,-i直接修改文件内容(而不是输出到终端)
法四:
[root@lll3 data]# awk /[^oldboy]/ oldboy.txt ----[^oldboy] ^意思是非,即不是oldboy
test
liyao
总结:linux三剑客老大awk常用参数:-F指定分隔符显示几列,通过正则表达式取出你想要的内容
6>请用一条命令完成创建目录/oldboy/test,即创建/oldboy目录和/oldboy/test目录
[root@lll3 /]# mkdir -p /oldboy/test/
[root@lll3 /]# tree oldboy/
oldboy/
└── test
1 directory, 0 files
总结:mkdir常用参数:-p强制递归创建目录
7>已知/tmp目录下已经存在了test.txt文件,如何执行命令才能把/mnt/test.txt拷贝到/tmp下覆盖
掉/tmp/test.txt,而让linux系统不提示是否覆盖(root权限下)
root@lll3 /]# touch /tmp/test.txt;touch /mnt/test.txt;which cp -----which后接命令表示查找该命令所在全路径,还可以whereis,locate,find
alias cp='cp -i'
/bin/cp
您在 /var/spool/mail/root 中有新邮件
[root@lll3 /]# /bin/cp /tmp/test.txt /mnt/
[root@lll3 /]# alias ------查看系统中所有的别名
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@lll3 ~]# cat ~/.bashrc------别名的位置
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
总结: rm,mv,cp这些危险命令为何会有确认提示(用于保护措施防止误操作,另外一个把命令化繁为简)?
是因为系统中别名的作用,如使用cp时默认就是用cp -i参数,所以会有参数。 取消别名可以用unalias接命令。
定义永久别名可以在/etc/profile中定义。
8>只查看ett.txt文件里(100行)20到第30行的内容
[root@lll3 tmp]# touch ett.txt;for ((i=1;i<=100;i++));do echo "$i">>ett.txt;done
[root@lll3 tmp]# head -30 ett.txt|tail -11 ----head显示文件前多少行,tail显示文件后多少行
20
21
22
23
24
25
26
27
28
29
30
法二:
[root@lll3 tmp]# touch ett.txt;seq 100 >> ett.txt
[root@lll3 tmp]# sed -n '20,30p' ett.txt
20
21
22
23
24
25
26
27
28
29
30
法三:
[root@lll3 tmp]# touch ett.txt;for i in {1..100};do echo "$i" >>ett.txt;done
[root@lll3 tmp]# awk 'NR==20,NR==30' ett.txt
20
21
22
23
24
25
26
27
28
29
30
法四:
[root@lll3 tmp]# touch ett.txt;i=1;while((i<=100));do echo "$i" >>ett.txt;((i++));done
[root@lll3 tmp]# awk '{if(NR>19&&NR<31) print $0}' ett.txt
20
21
22
23
24
25
26
27
28
29
30
总结:sed擅长行处理,awk擅长列处理
9>把系统中所有ett.txt文件中oldboylinux字符串替换成oldboywindows
root@lll3 tmp]# echo "oldboylinux">ett.txt;cp ett.txt /opt/;cp ett.txt /etc/
cp:是否覆盖"/opt/ett.txt"? y
cp:是否覆盖"/etc/ett.txt"? y
[root@lll3 tmp]# sed -i s#oldboylinux#oldboywindows#g ett.txt
[root@lll3 tmp]# find / -type f -name "ett.txt"|xargs sed -i s#oldboylinux#oldboywindows#g
[root@lll3 tmp]# find / -type f -name "ett.txt"|xargs cat
oldboywindows
oldboywindows
oldboywindows
[root@lll3 tmp]# find / -type f -name "ett.txt"|xargs ls
/etc/ett.txt /opt/ett.txt /tmp/ett.txt
总结:secureCRT常用操作快捷键
ctrl+c 终止命令;
ctrl+d 跳出用户环境;
ctrl+a 到命令行行首;
ctrl+e 到命令行行尾;
ctrl+u 清除所在命令行;
一技之长,理财投资,写作思考 敬请关注“石林笔记”公众号或者扫我喲: