关于linux 一些例子(gred,sed,awk等命令)
时间:2016-11-29 21:39 来源:linux.it.net.cn 作者:IT
将平时做的例子贴出来(附带上实验中的几个文本文件)
1、查找当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件;
find . -perm 644
2、查找系统中所有文件长度为0的普通文件,并列出它们的完整路径;
find / -empty
find / -size 0 -type f
3、查找/mai目录中更改时间在7日以前的普通文件,并在删除之前询问它们;
find . -type f -mtime +7 -ok rm {} \;
-ok 提示是否进行操作
4、查找系统中所有属于root组的文件 并列出它们的完整路径.
find / -group root
5、myfile.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'
6、使用tr命令将trkh.txt文件的空行删除
tr -s ['\n']<trkh.txt
-s命令删除意思[] 和后面的<file-input为固定格式
7、在txt目录下搜索所有包含有‘the’单词的.c文件,列出文件名
ls | grep '.*the.*\.c'
8、使用grep将express文件里以数字开头的行删除掉
grep '^[^[0-9]]*' express
用grep和awk写出实现下列功能地命令:
9.查出所有用户名至少有4个字符地己登录用户
users | grep '.\{4,\}'
who | awk '{if ($1~/.....*/) print $1}'
10.查出系统中所有用户标识号大于99的用户
cat /etc/passwd | awk 'BEGIN{FS=":"}{if ($3>99) print $1}'
用户标识符在passwd文件以:号分隔的第三个域
11.系统中用户标识号大于99的用户数
cat /etc/passwd | awk 'BEGIN{FS=":";users=0}{if ($3>99) users++; } END{ print users}'
12.按文件大小的降序列出目录中的所有文件
ls -l | sort -gr -k5
-g表示按大小排列
-r表示倒序
-k5表示按第五域排序
(13-34)分别使用sed和awk实现下面的功能(使用express文件)
13.在每一行后面增加一空行
sed G express
G为把内容缓冲区内容添加当前行,当前内容缓冲区为空行
awk '{print $0 "\n"}' express
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
%s\n\n为增加1空行
%s\n为参数替换位置符号
16.删除所有偶数行
sed 'n;d' express
n读取下一行
d是删除当前行
awk 'NR%2!=0{print $0}'NR为到目前为止的记录数
17.在匹配The的行前插入空行
sed '/The/{x;p;x}' express
匹配后执行大括号里面命令的。
X命令是将模式空间的内容和内容缓冲区内容互换
p是打印当前模式空间行
awk '{if (/The/) printf("\n%s\n",$0); else print $0}' express
18.输出行号,行号和正文间加冒号
sed '=' express | sed 'N;s/\n/:/'
=表示打印当前行号,
s/****/String
后一个sed实现将下一行读取进模式空间,用:号匹配换行符
awk '{printf("%d:%s\n",NR,$0)}' express
%d将替换为NR
%s将替换为$0
19.对文件中的所有非空行编号
sed '/./=' express | sed '/./N;s/\n/:/'
给在非空行前一行插入编号行,后一个sed当非空行时取出下一行并将换行符转换成:号
awk '{if (/./) printf("%d:%s\n",NR,$0);else print $0}' express
如果非空行,则在编号和数据行间插入:
20.计算行号(模拟 “wc -l”)
sed -n '$=' express
设置静默,然后在最后一行前插入编号,然后输出编号。由于静默是,所以行没输出
awk 'END {print NR}' express
21.模拟dos2unix
sed 's/^M//g' express > express1
将^M符号删掉。在windows中的文件到linux下在每一行后面都会出现^M字符串
awk 'gsub(/^M/,""){print $0}' express > express2
22.将所有good改为bad并打印且只打印该行
sed -n 's/good/bad/gp' express
n为静默模式,p为打印
awk 'gsub("good","bad"){print $0}' express
gsub全面替换
23.将包含is的行的good改为bad并打印且只打印该行
sed -n '/is/{/good/{s/good/bad/gp}}' express
awk '{if ($0~/is/ && $0~/good/) {gsub(/good/,"bad"); print $0}}' express
24.将不包含is的行的good改为bad并打印且只打印该行
sed -n '/is/!{/good/{s/good/bad/g;p}}' express
!为表示后面的命令对所有没有被选定的行发生作用
g为全面替换
awk '{if ($0!~/is/ && $0~/good/) {gsub(/good/,"bad"); print $0}}' express
25.显示文件中的前10行 (模拟“head” )
sed 10q express
输出10行后q表退出
awk '{if (NR<11) print $0}' express
26.在每5行后增加一空白行
sed 'n;n;n;n;G' express
n读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
awk '{if (NR%5!=0) print $0;else printf("%s\n\n",$0)}' express
27.倒置所有行,第一行成为最后一行,依次类推(模拟“tac”) sed '1!G;h;$!d' express
将新读入行加上缓冲区内容,如果当前行不是结束行,则将模式区内容再拷贝到缓冲区去
sed '1!G;h;$!d' express
将新读入行加上缓冲区内容,如果当前行不是结束行,则将模式区内容再拷贝到缓冲区去
awk '{A[i++]=$0}END{for(j=i-1;j>=0;j--)print A[j]}' express
28.显示文件中的最后10行(模拟“tail”)
sed '1!G;h;$!d' express | sed 10q
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
29.显示文件中的最后2行(模拟“tail -2”命令)
sed '$!N;$!D' express
不是最后一行则追加下一行,判对是否为当前行号是否为最后一行,不是删除就当前模式空间第一行
N追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
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 '9p' 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
”逗号“前后2个匹配字符串表示2个对应行(包括对应行)之间所有行。
awk 'BEGIN{p=0}{if ($0~/apple/ || p==1){p=1;print $0}}' express
刚开始设置标志p为0,表示当前行没有包含apple,当遇到匹配apple时候的,标志p置为1,之后一直输出到结束行
34.显示通篇文档,除了从包含apple的行到包含google的行
sed '/apple/,/google/d' express
同上
awk 'BEGIN{p=0{if ($0!~/apple/ && p==0)print $0;else p=1;if ($0~/google/) p=0;}' express
初始p为0,表示当前行不匹配含有apple,当遇apple后p置1, 当遇google后p置0
35.解释一下什么是shell
/*--------------------------------------------------
文字操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。
Shell基本上是一个命令解释器.
----------------------------------------------------*/
36.编写一个名为nf的程序,显示当前目录中的文件数。键入程序并测试。
/*----------------------------------------------------
ls | awk '{files++}END {print files}'
-----------------------------------------------------*/
37.编写一个名为whos的程序,显示排好序的已登录用户清单。只显示用户名,不要有其他信息。键入程序并测试。
/*-------------------------------------------------------
who | sort -r -n -k1 | awk '{print $1}'
--------------------------------------------------------*/
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 they are $*
---------------------------------------------------*/
42.编写一个脚本,统计参数的总数。
/*--------------------------------------------------
echo there are $# arguments passed
---------------------------------------------------*/
43 编写一个名为rename的程序,给第1个参数所给定的文件更名,在原名后添加第2个参数包含的一串字符。即
rename memol .sv
应该将文件memol更名为memol.sv
/*----------------------------------------------------
mv $1 $1$2
------------------------------------------------------*/
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
------------------------------------------------------*/
46 编写一个shell脚本,使用循环语句将当前目录下的.c文件更名为.cpp.
/*-----------------------------------------------------
#!/bin/sh
#ctag
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命令有啥区别?举例说明。
/*-----------------------------------------------------
虽然exec和source都是在父进程中直接执行,但exec这个与source有很大的区别,source是执行shell脚本,而且执行后会返回以前的shell。而exec的执行不会返回以前的shell了,而是直接把以前登陆shell作为一个程序看待,在其上经行复制。
不过,要注意一个例外,当exec命令来对文件描述符操作的时候,就不会替换shell,而且操作完成后,还会继续执行接下来的命令。
在shell中执行ls,ls结束后不返回原来的shell中了
exec ls
将express中的内容作为exec的标准输入
exec < express
将express中的内容作为标准写出
exec > express
在当前目录下(包含子目录),删除所有txt文件
find ./ -name "*.txt" -exec rm {}
------------------------------------------------------*/
48.将当前目录下的所用文件打包成一个文件。
/*-----------------------------------------------------
#!/bin/sh
#cmprs
tar czvf my.tar.gz $(ls)
------------------------------------------------------*/
实验用文件txt目录,express文件
(责任编辑:IT)
将平时做的例子贴出来(附带上实验中的几个文本文件) 1、查找当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件;
find . -perm 644
2、查找系统中所有文件长度为0的普通文件,并列出它们的完整路径;
find / -empty
find / -size 0 -type f
find . -type f -mtime +7 -ok rm {} \;
-ok 提示是否进行操作
find / -group root
5、myfile.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'
6、使用tr命令将trkh.txt文件的空行删除
tr -s ['\n']<trkh.txt
-s命令删除意思[] 和后面的<file-input为固定格式
7、在txt目录下搜索所有包含有‘the’单词的.c文件,列出文件名
ls | grep '.*the.*\.c'
8、使用grep将express文件里以数字开头的行删除掉
grep '^[^[0-9]]*' express
用grep和awk写出实现下列功能地命令: 9.查出所有用户名至少有4个字符地己登录用户
users | grep '.\{4,\}'
who | awk '{if ($1~/.....*/) print $1}' 10.查出系统中所有用户标识号大于99的用户
cat /etc/passwd | awk 'BEGIN{FS=":"}{if ($3>99) print $1}'
用户标识符在passwd文件以:号分隔的第三个域
cat /etc/passwd | awk 'BEGIN{FS=":";users=0}{if ($3>99) users++; } END{ print users}'
12.按文件大小的降序列出目录中的所有文件
ls -l | sort -gr -k5
-g表示按大小排列
(13-34)分别使用sed和awk实现下面的功能(使用express文件)
sed G express
G为把内容缓冲区内容添加当前行,当前内容缓冲区为空行 awk '{print $0 "\n"}' express
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 %s\n\n为增加1空行 %s\n为参数替换位置符号
16.删除所有偶数行
sed 'n;d' express
n读取下一行 awk 'NR%2!=0{print $0}'NR为到目前为止的记录数
sed '/The/{x;p;x}' express
匹配后执行大括号里面命令的。 X命令是将模式空间的内容和内容缓冲区内容互换 p是打印当前模式空间行 awk '{if (/The/) printf("\n%s\n",$0); else print $0}' express
18.输出行号,行号和正文间加冒号
sed '=' express | sed 'N;s/\n/:/'
=表示打印当前行号, s/****/String 后一个sed实现将下一行读取进模式空间,用:号匹配换行符 awk '{printf("%d:%s\n",NR,$0)}' express %d将替换为NR %s将替换为$0
19.对文件中的所有非空行编号
sed '/./=' express | sed '/./N;s/\n/:/'
给在非空行前一行插入编号行,后一个sed当非空行时取出下一行并将换行符转换成:号 awk '{if (/./) printf("%d:%s\n",NR,$0);else print $0}' express 如果非空行,则在编号和数据行间插入:
sed -n '$=' express
设置静默,然后在最后一行前插入编号,然后输出编号。由于静默是,所以行没输出 awk 'END {print NR}' express 21.模拟dos2unix
sed 's/^M//g' express > express1
将^M符号删掉。在windows中的文件到linux下在每一行后面都会出现^M字符串 awk 'gsub(/^M/,""){print $0}' express > express2
22.将所有good改为bad并打印且只打印该行
sed -n 's/good/bad/gp' express
n为静默模式,p为打印 awk 'gsub("good","bad"){print $0}' express gsub全面替换
23.将包含is的行的good改为bad并打印且只打印该行
sed -n '/is/{/good/{s/good/bad/gp}}' express
awk '{if ($0~/is/ && $0~/good/) {gsub(/good/,"bad"); print $0}}' express 24.将不包含is的行的good改为bad并打印且只打印该行
sed -n '/is/!{/good/{s/good/bad/g;p}}' express
!为表示后面的命令对所有没有被选定的行发生作用 g为全面替换 awk '{if ($0!~/is/ && $0~/good/) {gsub(/good/,"bad"); print $0}}' express
sed 10q express
输出10行后q表退出 awk '{if (NR<11) print $0}' express 26.在每5行后增加一空白行
sed 'n;n;n;n;G' express
n读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。 awk '{if (NR%5!=0) print $0;else printf("%s\n\n",$0)}' express 27.倒置所有行,第一行成为最后一行,依次类推(模拟“tac”) sed '1!G;h;$!d' express 将新读入行加上缓冲区内容,如果当前行不是结束行,则将模式区内容再拷贝到缓冲区去
sed '1!G;h;$!d' express awk '{A[i++]=$0}END{for(j=i-1;j>=0;j--)print A[j]}' express 28.显示文件中的最后10行(模拟“tail”)
sed '1!G;h;$!d' express | sed 10q
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
29.显示文件中的最后2行(模拟“tail -2”命令)
sed '$!N;$!D' express
不是最后一行则追加下一行,判对是否为当前行号是否为最后一行,不是删除就当前模式空间第一行 N追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。 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 '9p' 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
”逗号“前后2个匹配字符串表示2个对应行(包括对应行)之间所有行。 awk 'BEGIN{p=0}{if ($0~/apple/ || p==1){p=1;print $0}}' express 刚开始设置标志p为0,表示当前行没有包含apple,当遇到匹配apple时候的,标志p置为1,之后一直输出到结束行
34.显示通篇文档,除了从包含apple的行到包含google的行
sed '/apple/,/google/d' express
同上 awk 'BEGIN{p=0{if ($0!~/apple/ && p==0)print $0;else p=1;if ($0~/google/) p=0;}' express 初始p为0,表示当前行不匹配含有apple,当遇apple后p置1, 当遇google后p置0
实验用文件txt目录,express文件 (责任编辑:IT) |