关于linux 一些例子

1、查找当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件;

 

/*--------------------------------------------------

 

       find . -perm 644

       find . -type f -perm 644 -exec ls -l {} \;  //注意{}这个大括号之间是没有空格的。

 

     -perm  按照文件权限来查找文件。

     格式:文件存取权限的表示方法,用数字10表示各个权位  

     例如:某个文件的存取权限是,文件主有读写和执行的权限,组用户有读和执行的权限,其他用户仅有读的权限,用符号模式表示是rwxr-xr--,用二进制数字表示是111 101 100 ,即 754

 

----------------------------------------------------*/

 

2、查找系统中所有文件长度为0的普通文件,并列出它们的完整路径;

 

/*--------------------------------------------------

 

find / -empty "-empty" 返回大小为0的普通文件

find / -size 0 -type f

     find / -type f -size 0 -exec ls -l {} \;

----------------------------------------------------*/

 

3、查找/zsh目录中更改时间在7日以前的普通文件,并在删除之前询问它们;

 

/*--------------------------------------------------

 

find . -mtime +7 -ok rm {} \; "-ok" 提示是否进行操作

 

 

    在系统根目录下查找更改时间在5日以内的文件,可以用:

       find / -mtime -5 -print

 

----------------------------------------------------*/

 

4、查找系统中所有属于root组的文件 并列出它们的完整路径.

 

/*--------------------------------------------------

 

find / -group root

 

$find . -group root -exec ls -l {} \;

----------------------------------------------------*/

 

5myfile.html内容如下:

<b>This</b> is what <b>I</b> meant.

删除HTML标记,也就是要得到:

This is what I meant.

 

/*--------------------------------------------------

 

cat myfile.html| sed 's/<b>//g;s/<\/b>//g'

 

     Sed  '/<[^>]*>/ /g' myfile.html

 

----------------------------------------------------*/

 

6、使用tr命令将trkh.txt文件的空行删除

 

/*--------------------------------------------------

 

  tr -s ["\n"]<trkh.txt

        tr -s "[\012]"<trkh.txt   // \012表示\n

 

      tr参数:

        -s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。

 

----------------------------------------------------*/

 

7、在txt目录下搜索所有包含有‘the’单词的.c文件,列出文件名

/*--------------------------------------------------

       ls | grep 'the‘ *.c   //会显示内容

        ls | grep -l 'the' *.c //只显示文件名

    grep参数:-l:查询多文件时只输出包含匹配字符的文件名。

----------------------------------------------------*/

 

8、使用grepexpress文件里以数字开头的行删除掉

/*--------------------------------------------------

grep '^[^[:digit:]]' express  //此句的理解是:显示不是数字开头的行

      grep -v ‘^[0-9]’ express

      -v 显示不包含匹配文本的所有行

----------------------------------------------------*/

写出实现下列功能地命令:

 

9.查出所有用户名至少有4个字符地己登录用户

/*--------------------------------------------------

users | grep '.....*' 

who | awk '{if ($1~/.....*/) print $1}'

----------------------------------------------------*/

 

10.查出系统中所有用户标识号大于99的用户

/*--------------------------------------------------

 

cat /etc/passwd | awk 'BEGIN{FS=":"}{if ($3>99) print $1}'

 

FS 输入字段分隔符,相当于-F选项 

cat /etc/passwd  首先输出系统用户信息

$3是第三列信息,即用户标识号  

----------------------------------------------------*/

 

11.系统中用户标识号大于99的用户数

/*--------------------------------------------------

cat /etc/passwd | awk 'BEGIN{FS=":";users=0}{if ($3>99) users++; } END{ print users}'

----------------------------------------------------*/

 

12.按文件大小的降序列出目录中的所有文件

/*--------------------------------------------------

 ls -l | sort -grk5

 

 解释:

ls参数:-l  使用较长格式列出信息

sort 参数: 

-g   按照常规数值排序

-r   以相反的顺序来排序。

-k   指定哪一列排序

----------------------------------------------------*/

 

13-34)分别使用sedawk实现下面的功能(使用express文件)

13.在每一行后面增加一空行

/*--------------------------------------------------

 

sed G express

 

awk '{print $0 "\n"}' express

 

解释:sed 参数:

              h 拷贝模板块的内容到内存中的缓冲区。

              H 追加模板块的内容到内存中的缓冲区

              d 从模板块(Pattern space)位置删除行。

              D 删除模板块的第一行。

              g  获得内存缓冲区的内容,并替代当前模板块中的文本。

              G  获得内存缓冲区的内容,并追加到当前模板块文本的后面。

              n  读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。

              N  追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。

              x  表示互换模板块中的文本和缓冲区中的文本。

           选项: -n 取消默认输出。

----------------------------------------------------*/

 

14.设置文本中每一行后面有且只有一空行。

/*--------------------------------------------------

sed '/^$/d;G' express

awk '!/^$/{printf("%s\n\n",$0)}' express

----------------------------------------------------*/

 

15.在每行后面增加2行空行

/*--------------------------------------------------

sed '/^$/d;G;G' express

awk '!/^$/{printf("%s\n\n\n",$0)}' express

----------------------------------------------------*/

 

16.删除所有偶数行

/*--------------------------------------------------

sed 'n;d' express 

 解释:sed 命令先从文件中读取第一行内容放在模式空间中并打印,之后读取第二行内容,此时执行下一个命令是删除,以此类推,最后打印输出的内容是偶数行。

 

awk 'NR%2!=0{print $0}' express

 

awk:

NR 已经读出的记录数

FNR   当前文件的记录数

FS 输入字段分隔符(缺省为:space:),相当于-F选项

OFS输出字段分隔符(缺省为:space:

NF:当前记录中的字段个数  

  awk -F ':' '{print NF}' b  表明b的每一行用分隔符":"分割后都3个字段

RS:输入记录分隔符,缺省为"\n"

ORS:输出记录分隔符,缺省为换行符,控制每个print语句后的输出符号

----------------------------------------------------*/

 

17.在匹配The的行前插入空行

/*--------------------------------------------------

sed '/The/{x;p;x}' express

 

awk '{if (/The/) printf("\n%s\n",$0); else print $0}' express

----------------------------------------------------*/

 

18.输出行号,行号和正文间加冒号

/*--------------------------------------------------

sed '=' express | sed 'N;s/\n/:/'  

 

awk '{printf("%d:%s\n",NR,$0)}' express

 

sed = express 输出行号

sed  N  追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。

----------------------------------------------------*/

 

19.对文件中的所有非空行编号

 

/*--------------------------------------------------

方法一:保留了空行

sed '/./=' express | sed '/./N;s/\n/:/'

awk '{if (/./) printf("%d:%s\n",NR,$0);else print $0}' express

 

方法二:去掉空行

sed '/^$/d;=' express | sed 'N;s/\n/:/'

awk '!/^$/{print("%d:%s\n",NR,$0)}' express

 

----------------------------------------------------*/

 

20.计算行号(模拟 “wc -l”

 

/*--------------------------------------------------

 

sed -n '$=' express

 

awk 'END {print NR}' express

 

sed: -n 取消自动打印模式空间

 

----------------------------------------------------*/

 

21.模拟dos2unix

 

/*--------------------------------------------------

  dos格式文件传输到unix系统时,会在每行的结尾多一个^M

 

  DOS下的文本文件是以\r\n作为断行标志的,表示成十六进制就是0D 0A

  而Unix下的文本文件是以\n作为断行标志的,表示成十六进制就是 0A

 

方法一:

sed 's/^M//g' express > express1  

awk 'gsub(/^M/,""){print $0}' express > express2

 

表示全局替换

方法二:

cat express | tr -d "" >express3

 

tr 选项:-d 删除字符串1中所有输入字符。

----------------------------------------------------*/

 

22.将所有good改为bad并打印且只打印该行

 

/*--------------------------------------------------

 

sed -n 's/good/bad/gp‘ express

 

awk 'gsub("good","bad"){print $0}' express

 

----------------------------------------------------*/

 

23.将包含is的行的good改为bad并打印且只打印该行

 

/*--------------------------------------------------

 

sed -n '/is/{/good/{s/good/bad/g;p}}' express

 

awk '{if ($0~/is/ && $0~/good/) {gsub(/good/,"bad"); print $0}}' express

 

可理解为 =

 

----------------------------------------------------*/

 

24.将不包含is的行的good改为bad并打印且只打印该行

 

/*--------------------------------------------------

  sed -n '/is/!p' express 将不包含is的行打印输出

 

sed -n '/is/!{/good/{s/good/bad/g;p}}' express

 

awk '{if ($0!~/is/ && $0~/good/) {gsub(/good/,"bad"); print $0}}' express

 

----------------------------------------------------*/

 

25.显示文件中的前10行 (模拟“head” 

 

/*--------------------------------------------------

 

sed 10q express

 

awk '{if (NR<11) print $0}' express

 

----------------------------------------------------*/

 

26.在每5行后增加一空白行

 

/*--------------------------------------------------

 

sed 'n;n;n;n;G' express

 

awk '{if (NR%5!=0) print $0;else printf("%s\n\n",$0)}' express

 

----------------------------------------------------*/

 

27.倒置所有行,第一行成为最后一行,依次类推(模拟“tac”

 

/*--------------------------------------------------

 

sed '1!G;h;$!d' express  

 

awk '{A[i++]=$0}END{for(j=i-1;j>=0;j--)print A[j]}' express

 

sed :h 拷贝模板块的内容到内存中的缓冲区。

     H 追加模板块的内容到内存中的缓冲区

     d 从模板块(Pattern space)位置删除行。

     D 删除模板块的第一行。

 

----------------------------------------------------*/

 

28.显示文件中的最后10行 (模拟“tail”

 

/*--------------------------------------------------

 

sed -e :a -e '$q;N;11,$D;ba'

 

awk '{a[i++]=$0}END{if (i>10) for (j=i-10;j<i;j++) print a[j];else for (j=0;j<i;j++)print a[j]}' express

 

sed方法相关命令参数:

-e 直接在指令列模式上进行 sed 的动作编辑,允许多台编辑。

:a 表示建立一个标签a

b  跳转命令,这个命令是无条件跳转

ba表示跳转到标签a

退出Sed

追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。

删除模板块的第一行。

11 表示文件第十一行

 

----------------------------------------------------*/

 

 

29.显示文件中的最后2行(模拟“tail -2”命令)

 

/*--------------------------------------------------

 

sed '$!N;$!D' express  

sed -e :a -e '$q;N;3,$D;ba'

 

awk '{a[i++]=$0}END{if (i>2) for (j=i-2;j<i;j++) print a[j];else for (j=0;j<i;j++)print a[j]}' express

 

----------------------------------------------------*/

 

30.显示文件中的最后一行(模拟“tail -1”

 

/*--------------------------------------------------

 

sed 'N;D' express

 

awk 'END{print $0}' express

 

----------------------------------------------------*/

 

31.显示第9

 

/*--------------------------------------------------

 

sed -n '9pq' express

 

awk '{if (NR==9) print $0}' express

 

----------------------------------------------------*/

 

32.显示包含50个或以上字符的行

 

/*--------------------------------------------------

 

sed -n '/^.\{50\}/p' express

 

awk '{if (length($0)>=50) print $0}' express

 

----------------------------------------------------*/

 

33.显示部分文本——从包含apple的行开始到最后一行结束

 

/*--------------------------------------------------

 

sed -n '/apple/,$p' express

 

awk 'BEGIN{p=1}{if ($0~/apple/ || p==0){p=0;print $0}}' express

 

----------------------------------------------------*/

 

34.显示通篇文档,除了从包含apple的行到包含google的行

 

/*--------------------------------------------------

 

sed '/apple/,/google/d' express

 

awk 'BEGIN{p=1}{if ($0!~/apple/ && p==1)print $0;else p=0;if ($0~/google/) p=1;}' express   

//输出有错误:如果有两个google的话,会匹配第一个,而第二个还会打印输出

 

----------------------------------------------------*/

 

35.解释一下什么是shell

 

/*--------------------------------------------------

 

文字操作系统与外部最主要的接口就叫做shellshell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。

 

Shell基本上是一个命令解释器.

 

----------------------------------------------------*/

 

36.编写一个名为nf的程序,显示当前目录中的文件数。键入程序并测试。

 

/*----------------------------------------------------

 

ls | awk '{files++}END {print files}' 

 

-----------------------------------------------------*/

 

37.编写一个名为whos的程序,显示排好序的已登录用户清单。只显示用户名,不要有其他信息。键入程序并测试。

 

/*-------------------------------------------------------

 

who | sort -r -n -k1 | awk '{print $1}' 

sort:

-r 颠倒指定排序的顺序。

-k作用是根据某个列来排序,默认是第1列(从1开始)。

-t表示分割符,以:分割,默认情况下以空格分割

-nrk 5即是按照数字方式倒序排序,根据文件属性的第5列即是文件大小排序

 

--------------------------------------------------------*/

 

38.在终端上显示

<<< echo $x >>> displays the value of x,which is $x

显示的时候,第2$x的值应该被替换,比如如果x=3,显示:

<<< echo $x >>> displays the value of x,which is 3

 

/*----------------------------------------------------------

 

x=3

echo "<<< echo \$x >>> displays the value of x,which is $x"

 

-----------------------------------------------------------*/

 

 

39.依次执行下面三条命令,分析结果。

filename=/home/zsh/express

filename=$(echo $filename | tr “$(echo $filename | cut –c1)” “^”)

echo $filename

 

/*--------------------------------------------------------

 

结果为: ^home^zsh^express

 

--------------------------------------------------------*/

 

40.shell编程里的$(…)结构是什么作用,举例说明。

 

/*-------------------------------------------------------

 

作用:把一个命令的标准输出插入在一个命令行中任何位置

例如:上例中 $(echo $filename | cut –c1)

 

` ` 也具有相同作用

 

--------------------------------------------------------*/

 

41.编写一脚本,打印出所有的参数。

 

/*--------------------------------------------------

 

echo the are $*

 

创建一个文件test,在里面编写如下命令:

echo the following parameters below are transmitted: $*

在终端进入rename所在的目录,运行./test 12 23 34

 

$* 传递给shell script的参数

 

---------------------------------------------------*/

 

42.编写一个脚本,统计参数的总数。

 

/*--------------------------------------------------

 

echo there are $# arguments passed

 

         $# 表示传递给shell script的参数个数

 

---------------------------------------------------*/

 

43 编写一个名为rename的程序,给第1个参数所给定的文件更名,在原名后添加第2个参数包含的一串字符。即

     rename memol   .sv

    应该将文件memol更名为memol.sv 

 

/*----------------------------------------------------

 

创建一个rename的文件,在里面编写:

                mv $1 $1$2

                chmod +x rename   //使文件成为可执行文件

                在终端进入rename所在的目录,运行./rename a   .txt

        其中a为需要修改的文件名

 

------------------------------------------------------*/   

 

44编写一个名为unrename的程序,从第1个参数指定的文件名的后部去掉第2个参数包含的字符串,即

     unrename memol.sv   .sv

     应该把文件memol.sv更名为memol。要保证从尾部去掉字 符串,如

    unrename test1test  test

    应该将tes1test更名为test1(提示:sed和命令替换)

 

/*------------------------------------------------------

 

mv $1 $(echo $1 | sed "s/$2$//")

 

-------------------------------------------------------*/  

 

45 编写名为valid 的程序,如果参数是合法的shell 变量名,则显示“yes”,否则显示“no”

 

/*-----------------------------------------------------

 

if echo "$1" | grep -q '^[a-zA-Z][a-zA-Z0-9]*$' 

then

echo "yes"

else

echo "no"

fi

 

-q 取消显示,只返回退出状态。

------------------------------------------------------*/

 

46 编写一个shell脚本,使用循环语句将当前目录下的.c文件更名为.cpp.

 

/*-----------------------------------------------------

for loop in $(ls)

do

if echo "$loop" | grep -q '\.c'

then

echo "rename $loop to $(echo $loop|sed "s/\.c$/\.cpp/")"

mv $loop $(echo $loop|sed "s/\.c$/\.cpp/")

fi

done

 

------------------------------------------------------*/

 

47. source命令和exec命令有啥区别?举例说明。

 

/*-----------------------------------------------------

 

虽然execsource都是在父进程中直接执行,但exec这个与source有很大的区别,source是执行shell脚本,而且执行后会返回以前的shell。而exec的执行不会返回以前的shell了,而是直接把以前登陆shell作为一个程序看待,在其上经行复制。

 

不过,要注意一个例外,当exec命令来对文件描述符操作的时候,就不会替换shell,而且操作完成后,还会继续执行接下来的命令。

 

shell中执行lsls结束后不返回原来的shell中了

exec ls

 

express中的内容作为exec的标准输入

exec < express

 

express中的内容作为标准写出

exec > express

 

在当前目录下(包含子目录),删除所有txt文件

find ./ -name "*.txt" -exec rm {}

 

------------------------------------------------------*/

 

48.将当前目录下的所用文件打包成一个文件。

 

/*-----------------------------------------------------

 

tar -czvf my.tar.gz $(ls)

 

注意:选项必须放在最后

关于tar命令:

 

-c :建立一个压缩文件的参数指令(create 的意思)

-x :解开一个压缩文件的参数指令!

-t :查看 tarfile 里面的文件!

-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?

-j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?

-v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!

-f :使用档名,请留意,在 之后要立即接档名喔!不要再加参数!

-p :使用原文件的原来属性(属性不会依据使用者而变)

-P :可以使用绝对路径来压缩!

-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中!

------------------------------------------------------*/

 

posted @ 2011-06-09 13:25  月亮的影子  阅读(665)  评论(0编辑  收藏  举报