码迷,mamicode.com
首页 > 系统相关 > 详细

linux经典 题库(一)

时间:2017-09-03 00:27:37      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:awk   grep   sed

1.1创建一个目录/data

1)  解答: mkdir  /data


扩展:mkdir后面可以加参数-p,表示递归创建,也可以加参数-v,表示可以显示出创建的过程。



1.2oldboy.txt增加内容为“I am studying linux.”

解答:为文件增加内容目前有三种方法:

1)  用echo的方式追加内容:echo "I am studyinglinux"> /data/oldboy.txt


2)  用vi编辑器追加内容:vi /data/oldboy.txt   ##进入vi后输入i,进入编辑模式,输入要追加的内容,然后按esc键退出。


3)  用cat和eof配合输出  

cat >>/data/oldboy.txt <<eof

> I am studying enhlish

> eof



1.3已知文件test.txt内容为:

test

liyao

oldboy

请给出输出test.txt文件内容时,不包含oldboy字符串的命令。

解答:此题有几种解法

1)  利用head取文件的前两行即可


2)  用grep过滤排除  ,-v参数表示反转过滤。

grep -v"oldboy" test.txt



1.4只查看ett.txt文件(共100行)内第20到第30行的内容

解答:

1) 利用head和tail结合取

head -30 ett.txt |tail -11


2) 利用sed命令

sed -n"20,30p" ett.txt


3) 利用awk命令

awk"NR>=20&&NR<=30" ett.txt


 

1.5/oldboy目录及其子目录下所有以扩展名.sh结尾的文件中包含./hostlists.txt的字符串全部替换为../idctest_iplist

解答:

方法一find /root -type f -name "*.sh"|xargs sed -i ‘s#./hostlists.txt#../idctest_iplist #g‘

find用于查找文件,后面加参数-type 后面加文件类型,后面加要查询的文件名,-name;sed和xargs联合,加上sed is#替换前的内容#替换后的内容#g


 

方法二:利用变量函数

第一步:创建测试环境

[root@mao oldboy]# cat 5.sh

I am studying Linux

I am a goog boy

[root@mao oldboy]# cd.

-bash: cd.: command not found

[root@mao oldboy]# cd ..

[root@mao ~]# pwd

/root

第二步:先用find找到文件find /root/oldboy -type f-name ‘*.sh‘

[root@mao ~]# sed  ‘s#am#123456#g‘  $(find /root/oldboy -type f -name ‘*.sh‘)

466

I 123456 studying Linux

I 123456 a goog boy

466

第三步:利用sed‘s#替换前#替换后#g’先查看一下要别替换后的结果,$()的意思引用find的执行结果

[root@mao ~]# sed  ‘s#am#123456#g‘  $(find /root/oldboy  -name ‘*.sh‘ -type f )

466

I 123456 studying Linux

I 123456 a goog boy

466

第四步:sed后面加上参数 -i ,实现最后替换。

[root@mao ~]# sed  ‘s#am#123456#g‘  -i  $(find/root/oldboy  -name ‘*.sh‘ -type f )

[root@mao ~]# cat /root/oldboy/5.sh

I 123456 studying Linux

I 123456 a goog boy

[root@mao ~]#

 

1.6如何查看/etc/services文件内容有多少行?

解答:

第一种:

[root@oldboyedu oldboy]# cat -n/etc/services |tail -1

 10774  iqobject        48619/udp               # iqobject

[root@oldboyedu oldboy]# ##所有可以查看行号的命令 + tail -1

第二种:

[root@oldboyedu oldboy]# wc -l/etc/services

10774 /etc/services

生产场景中经常会通过wc -l计算服务进程个数等。然后通过脚本判断进程个数来检测服务是否正常,如进程数大于一个,说明进程还存在,服务一般就正常。

 

1.7如何过滤出已知当前目录下oldboy中的所有一级目录(提示:不包含oldboy目录下面目录的子目录及隐藏目录,即只能是一级目录)

解答:

1.7.1 第一种方法(tree -Ld 1

[root@mao data]# tree -Ld 1

.

├── niu

├── old

└── yu

3 directories

[root@mao data]#

注:tree命令是以树的结构显示目录结构,参数‘-L’ ,主要用于显示目录结构的层数;参数‘-d’ 用于显示目录的。

1.7.2第二种方法

[root@mao data]# ls -l |grep ‘^d‘

drwxr-xr-x 2 root root 4096 Mar 16 03:08 niu

drwxr-xr-x 3 root root 4096 Mar 16 03:07 old

drwxr-xr-x 3 root root 4096 Mar 16 03:07 yu

[root@mao data]#

注:此题用了grep与管道过滤查询,先用ls -l查出所有的文件,其中包括文件和目录,然后用到了通配符^,它后面加名字,表示以名字开头的文件。

 

1.7.3第三种方法

[root@mao data]#ll

total 16

-rw-r--r-- 1 root root    0 Mar 16 03:06 1

-rw-r--r-- 1 root root    0 Mar 16 03:06 2

-rw-r--r-- 1 root root    0 Mar 16 03:06 3

-rw-r--r-- 1 root root    0 Mar 16 03:06 44

-rw-r--r--. 1 root root   29 Mar 15 13:34 ett.txt

drwxr-xr-x 2 root root 4096 Mar 16 03:08 niu

drwxr-xr-x 3 root root 4096 Mar 16 03:07 old

drwxr-xr-x 3 root root 4096 Mar 16 03:07 yu

[root@mao data]# ls-l |awk ‘$2>1‘

total 16

drwxr-xr-x 2 root root 4096 Mar 16 03:08 niu

drwxr-xr-x 3 root root 4096 Mar 16 03:07 old

drwxr-xr-x 3 root root 4096 Mar 16 03:07 yu

[root@mao data]#

注:awk可以取列,利用变量$后面加列数可以实现,列如$2是取第二列,$6是取第六列。


1.7.4第四种方法

[root@mao data]#find -maxdepth 1 -type d

.

./yu

./niu

./old

[root@mao data]#

注:find是查询命令中很重要的,它和maxdepth可以查询目录的最大深度数,

-type 后面跟文件的类型,一般有普通文件,用f表示,目录文件用d表示。

-name    匹配某个名字

-name   不匹配某个名字

find后面的参数是有顺序的,一般maxdepth放前面

[root@mao data]# find -maxdepth 1 -type d  !-name ‘.‘

-bash: !-name: event not found

[root@mao data]# find -maxdepth 1 -type d  !-name ‘.‘    ##注意!和后面的空格

-bash: !-name: event not found

[root@mao data]# find-maxdepth 1 -type d ! -name ‘.‘

./yu

./niu

./old

[root@mao data]#


1.7.5第五种方法

[root@mao data]#ls -F|find -type d -name ‘$/‘

[root@mao data]# ls -F

1  2  3 44  ett.txt  niu/ old/  yu/

[root@mao data]# ls -F|grep ‘$/‘

[root@mao data]# ls-F|grep ‘/$‘

niu/

old/

yu/

[root@mao data]#

注:find是搜索文件的,而grep一般用于搜索字母或文字的。ls -F 用来将文件末尾加上‘/‘

 

 

1.8一个目录中有很多文件(ls -l查看时好多屏),想用一条命令最快速度查看到最近更新的文件。如何看?

解答:

 [root@mao~]# date

Thu Mar 16 05:28:51 CST 2017

[root@mao ~]# mkdir oldboy2

[root@mao ~]#ls -lrt

total 64

-rw-r--r--. 1 root root  5890 Mar 10 09:39 install.log.syslog

-rw-r--r--. 1 root root 21764 Mar 10 09:42install.log

-rw-------. 1 root root  1073 Mar 10 09:42 anaconda-ks.cfg

-rw-r--r--. 1 root root   201 Mar 12 20:45 oldboy.txt.bak

-rw-r--r--. 1 root root     0 Mar 12 21:07 file

-rw-r--r--. 1 root root    18 Mar 13 19:32 test.txt

drwxr-xr-x 2 root root  4096 Mar 16 00:31oldboy.txt

drwxr-xr-x 2 root root  4096 Mar 16 05:30oldboy2

drwxr-xr-x. 7 root root  4096 Mar 16 2017 oldboy

-rw-r--r--. 1 root root    10 Mar 16 2017 ett.txt

[root@mao ~]#

 

1.9已知apache服务的访问日志按天记录在服务器本地目录/app/logs下,由于磁盘空间紧张,现在要求只能保留最近7天的访问日志!请问如何解决? 请给出解决办法或配置或处理命令。(提示:可以从apache服务配置上着手,也可以从生成出来的日志上着手。)

解答:第一步:

首先创建运行环境:

[root@mao logs]#mkdir -p /app/logs2

[root@mao app]# cd logs2/

[root@mao logs2]# ll

total 0

[root@mao logs2]#for  time in  {01..16};do date -s "201703$time"; touch access_www_$(date +%F).log ;done

Wed Mar  100:00:00 CST 2017

Thu Mar  200:00:00 CST 2017

Fri Mar  300:00:00 CST 2017

Sat Mar  400:00:00 CST 2017

Sun Mar  500:00:00 CST 2017

Mon Mar  600:00:00 CST 2017

Tue Mar  700:00:00 CST 2017

Wed Mar  800:00:00 CST 2017

Thu Mar  900:00:00 CST 2017

Fri Mar 10 00:00:00 CST 2017

Sat Mar 11 00:00:00 CST 2017

Sun Mar 12 00:00:00 CST 2017

Mon Mar 13 00:00:00 CST 2017

Tue Mar 14 00:00:00 CST 2017

Wed Mar 15 00:00:00 CST 2017

Thu Mar 16 00:00:00 CST 2017

[root@mao logs2]# date-s "20170316"

Thu Mar 16 00:00:00 CST 2017

第二步:先找到日志文件

[root@mao logs2]# find-type f -name ‘*.log‘

./access_www_2017-03-04.log

./access_www_2017-03-02.log

./access_www_2017-03-03.log

./access_www_2017-03-01.log

./access_www_2017-03-09.log

./access_www_2017-03-07.log

./access_www_2017-03-16.log

./access_www_2017-03-10.log

./access_www_2017-03-05.log

./access_www_2017-03-15.log

./access_www_2017-03-11.log

./access_www_2017-03-08.log

./access_www_2017-03-12.log

./access_www_2017-03-13.log

./access_www_2017-03-06.log

./access_www_2017-03-14.log

第三步:使用find的参数-mtime ,查找某段时间前,然后利用管道查看出来。

[root@mao logs2]# find-type f -name ‘*.log‘ -mtime +7 |xargs ls -l

-rw-r--r-- 1 root root 0 Mar  1 00:00 ./access_www_2017-03-01.log

-rw-r--r-- 1 root root 0 Mar  2 00:00 ./access_www_2017-03-02.log

-rw-r--r-- 1 root root 0 Mar  3 00:00 ./access_www_2017-03-03.log

-rw-r--r-- 1 root root 0 Mar  4 00:00 ./access_www_2017-03-04.log

-rw-r--r-- 1 root root 0 Mar  5 00:00 ./access_www_2017-03-05.log

-rw-r--r-- 1 root root 0 Mar  6 00:00 ./access_www_2017-03-06.log

-rw-r--r-- 1 root root 0 Mar  7 00:00 ./access_www_2017-03-07.log

-rw-r--r-- 1 root root 0 Mar  8 00:00 ./access_www_2017-03-08.log

[root@mao logs2]#

第四步:最后一步删掉筛选的7天前的日志文件。

[root@mao logs2]# find-type f -name ‘*.log‘ -mtime +7 |xargs rm -fr

[root@mao logs2]# ll

total 0

-rw-r--r-- 1 root root 0 Mar  9 00:00 access_www_2017-03-09.log

-rw-r--r-- 1 root root 0 Mar 10 00:00access_www_2017-03-10.log

-rw-r--r-- 1 root root 0 Mar 11 00:00access_www_2017-03-11.log

-rw-r--r-- 1 root root 0 Mar 12 00:00access_www_2017-03-12.log

-rw-r--r-- 1 root root 0 Mar 13 00:00access_www_2017-03-13.log

-rw-r--r-- 1 root root 0 Mar 14 00:00access_www_2017-03-14.log

-rw-r--r-- 1 root root 0 Mar 15 00:00access_www_2017-03-15.log

-rw-r--r-- 1 root root 0 Mar 16 00:00access_www_2017-03-16.log

[root@mao logs2]#

 

1.10打印轻量级web服务的配置文件nginx.conf内容的行号及内容,该如何做?

解答:

1.10.1第一种方法:nl nginx.conf

[root@oldboy /]# nlnginx.conf

     1  stu1

     2  stu2

     3  stu3

     4  stu4

     5  stu5

[root@oldboy /]#

 

1.10.2第二种方法:vi nginx.conf 后使用set nu来呈现行号,set nonu来取消行号

[root@oldboy /]# vi nginx.conf

      1 stu1

      2 stu2

      3 stu3

      4 stu4

      5 stu5

~                                                                                        

:set nu

 

1.10.3第三种方法:cat -n nginx.conf

[root@oldboy /]# cat-n nginx.conf

     1  stu1

     2  stu2

     3  stu3

     4  stu4

     5  stu5

[root@oldboy /]#

注:

 

1.10.4第四种方法:awk ‘{print NR,$0}‘ nginx.conf

[root@oldboy /]#awk ‘{print NR,$0}‘ nginx.conf

1 stu1

2 stu2

3 stu3

4 stu4

5 stu5

[root@oldboy /]#

 

注:print 表示打印,NR表示行,$0表示整行

 

1.10.5第五种方法

[root@oldboy /]# grep-n ‘.‘ nginx.conf

1:stu1

2:stu2

3:stu3

4:stu4

5:stu5

[root@oldboy /]#

注:-n表示将每一行前面加行号,‘.’表示匹配所有

 

1.10.6第六种方法

[root@oldboy /]# sed= nginx.conf |xargs -n2

1 stu1

2 stu2

3 stu3

4 stu4

5 stu5

[root@oldboy /]#

 

注:sed后面的等号前后有空格,否则搜不出,

 

1.11/etc/目录为linux系统的默认的配置文件及服务启动命令的目录

  a.请用tar打包/etc整个目录(打包及压缩)

  b.请用tar打包/etc整个目录(打包及压缩,但需要排除/etc/services文件)

  c.请把a点命令的压缩包,解压到/tmp指定目录下(最好只用tar命令实现)

解答:

 A 解答

第一步:打包先进入要打包的目录下。

[root@mao etc]#cd /etc/

[root@mao etc]# tarzcf /mnt/etc.tar.gz /etc/

tar: Removing leading `/‘ from member names

tar: Removing leading `/‘ from hard link targets

[root@mao etc]# ls /mnt/

8  data  etc.tar.gz ett.txt  oldboy  test.txt

[root@mao etc]#

参数解析:tar后面的参数z表示以软件gzip压缩文件,c(create)创建压缩包,f(file)指定压缩包名字。

B

解答:

第一种方法

[root@mao etc]#tar zcf /mnt/paichu.tar.gz /etc/ --exclude=etc/services

tar: Removing leading `/‘ from member names

tar: Removing leading `/‘ from hard link targets

[root@mao etc]# ls /mnt/

8  data  etc.tar.gz ett.txt  oldboy  paichu.tar.gz  test.txt

[root@mao etc]#

创建成功后,查看是否排除成功。

[root@mao etc]# ls /mnt/

8  data  etc.tar.gz ett.txt  oldboy  paichu.tar.gz test.txt

[root@mao etc]#tar tf /mnt/paichu.tar.gz |grep services

etc/init/readahead-disable-services.conf

etc/etc/init/readahead-disable-services.conf

[root@mao etc]#

查看打包的包内容,可以用tart(list)f(file) 包名字。从上面查看可以看出来查出来的文件没有/etc/services的文件。

--exclude=后面加上要排除打包的路径,最好是相对路径。


第二种方法此方法用于排除一个或多个文件。

首先可以先将要排除的文件写入一个文件中,然后再排除。

[root@mao etc]# vi/mnt/paichu.txt

etc/services

etc/ssh

[root@mao etc]# tar zcf /mnt/paichu1.tar.gz /etc/--exclude-from=/mnt/paichu.txt

tar: Removing leading `/‘from member names

tar: Removing leading `/‘from hard link targets

[root@mao etc]# ls /mnt/

8     etc.tar.gz oldboy          paichu.tar.gz  test.txt

data  ett.txt    paichu1.tar.gz  paichu.txt

[root@mao etc]# tar tf /mnt/paichu1.tar.gz |grep services

etc/init/readahead-disable-services.conf

etc/etc/init/readahead-disable-services.conf


第三种方法:利用花括号{}里面写上要排除打包的文件名。

[root@mao etc]#tar zcf /mnt/paichu3.tar.gz /etc/ --exclude={ntp,pm}

tar: Removing leading `/‘ from member names

tar: Removing leading `/‘ from hard link targets

[root@mao etc]# tar tf /mnt/paichu3.tar.gz |grepntp

etc/dhcp/dhclient.d/ntp.sh

etc/ntp.conf

etc/X11/fontpath.d/

etc/rc.d/rc1.d/K74ntpd

 

1.12已知如下命令及结果:

[oldboy@test ~]$echo "I am oldboy,myqq is 31333741">>oldboy.txt

[oldboy@test ~]$ catoldboy.txt 

I am oldboy,myqq is31333741

现在需要从文件中过滤出oldboy31333741字符串,请给出命令.

解答:

第一种方法:先创建测试环境

此方法是先用cut命令指定空格为分隔符,将内容分为5份,然后用sed将‘,myqq‘ 这个多余的内容取出掉。

[root@mao data]# cat oldboy.txt

[root@mao data]# echo "I am oldboy,myqq is31333741">>oldboy.txt

[root@mao data]# cat oldboy.txt

I am oldboy,myqq is 31333741

[root@mao data]#cut -d ‘ ‘ -f3,5 oldboy.txt

oldboy,myqq 31333741

[root@mao data]# cut-d ‘ ‘ -f3,5 oldboy.txt |sed ‘s#,myqq##g‘

oldboy 31333741

[root@mao data]#

注意:cut是截取列,

-d, --delimiter=DELIM  加上参数d表示指定分割符,后面跟上单引号分隔符,-f 表示fields表示指定列名。


第二种方法:此方法是先用sed命令将内容中唯一的逗号替换掉(只是不显示出来),然后只剩下空格,这时候再用cut 命令分割。

[root@mao data]# cat oldboy.txt

I am oldboy,myqq is 31333741

[root@mao data]# sed ‘s#,# #g‘ oldboy.txt

I am oldboy myqq is 31333741

[root@mao data]# sed‘s#,# #g‘ oldboy.txt |cut -d ‘ ‘ -f3,6

oldboy 31333741

[root@mao data]#


第三种方法:此方法是用awk先搜索出第三列和第五列,然后用sed将“.myqq”替换成空。

[root@mao data]# cat oldboy.txt

I am oldboy,myqq is 31333741

[root@mao data]# awk ‘{print $3,$5}‘ oldboy.txt

oldboy,myqq 31333741

[root@mao data]# awk‘{print $3,$5}‘ oldboy.txt |sed ‘s#,myqq##g‘

oldboy 31333741

[root@mao data]#

awk 默认分隔符是空格,如果想指定某个分割符,可以加上F,后面加上指定的分隔符。


第四种方法:利用awk的F参数指定分隔符

[root@mao data]# awk -F ‘[ ,]‘ -f3,6 oldboy.txt

awk: fatal: can‘t open source file `3,6‘ forreading (No such file or directory)

[root@mao data]# awk-F ‘[ ,]‘ ‘{print $3,$6}‘ oldboy.txt

oldboy 31333741

[root@mao data]#

 

第五种方法:使用cut的参数c来去字符,空格与逗号都算一个字符。取得列前面不用加f

[root@mao data]# cut -c 6-11,20- oldboy.txt

oldboy 31333741

[root@mao data]#


第六种方法:此种方法是用先将这两句话换行成两行,然后取最后一行。

[root@mao data]# awk-F ‘[,]‘ ‘{print $1"\n"$2}‘ oldboy.txt    此处的F后面的‘[,]‘ 可以用,代替。

I am oldboy

myqq is 31333741

[root@mao data]# awk-F, ‘{print $1"\n"$2}‘ oldboy.txt |awk ‘{print $NF}‘

oldboy

31333741

[root@mao data]#

 

第七种方法:利用tr命令,它是精简版的sed。

[root@mao data]# tr ‘,‘  "\n" <oldboy.txt

I am oldboy

myqq is 31333741

[root@mao data]# tr ‘,‘  "\n" <oldboy.txt |awk ‘{printNF}‘

3

3

[root@mao data]# tr ‘,‘  "\n" <oldboy.txt |awk ‘{print$NF}‘

oldboy

31333741

[root@mao data]#

注:tr 后面的,表示指定逗号为分隔符,后面的\n表示搜索到以后从分隔符后换行。

 

1.13过滤出/etc/services 文件包含33061521两数据库端口的行的内容。

##使用grep过滤

[root@mao etc]# grep -E ‘1521|3306‘ services     |在引号中是或者的意思,不加单引号就是管道

mysql           3306/tcp                        # MySQL

mysql           3306/udp                        # MySQL

ncube-lm        1521/tcp                # nCube License Manager

ncube-lm        1521/udp                # nCube License Manager

[root@mao etc]#

##使用AWK过滤

[root@demo tmp]# awk ‘/1521|3306/‘ /etc/services

mysql           3306/tcp                        # MySQL

mysql           3306/udp                        # MySQL

ncube-lm        1521/tcp                # nCube License Manager

ncube-lm       1521/udp                # nCubeLicense Manager

##使用sed过滤

[root@demo tmp]# sed -nr ‘/1521|3306/‘ /etc/services

sed: -e expression #1, char 11: missing command

[root@demo tmp]# sed -nr ‘/1521|3306/p‘ /etc/services

mysql           3306/tcp                        # MySQL

mysql           3306/udp                        # MySQL

ncube-lm        1521/tcp                # nCube License Manager

ncube-lm        1521/udp                # nCube License Manager

[root@demo tmp]#

 


linux经典 题库(一)

标签:awk   grep   sed

原文地址:http://dadonggg.blog.51cto.com/12672150/1962211

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!