Linux的shell编程前奏常见命令实战一

                                                                          Linux的shell编程前奏常见命令实战一

前言: 

linux中命令的一般形式为:命令  [参数] [路径文件]。参数其实就相当于面向对象语言java中的方法的重载一样,即我实现一个行为有多种方法,每一种方法都需要必要的工具条件,可以把这些参数想象成这些参数。路径文件就相当于做一件事情你要指向的目标。做运维的原则简单,易用,高效。

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 
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







猜你喜欢

转载自blog.51cto.com/11218855/2299791