1.查找特定时间修改的文件:
- #!/bin/sh
- # Copyright by Ming Gong(宫敏) for news://news.freesoft.cei.gov.cn/chinese.com.linux
- # GPL V2, Jun 30, 1998
- # The right of usage, distribution and modification is here by granted by the author.
- # The author deny any responsibilities and liabilities related to the code.
- #Edit by deven 2012-05-31
- OK=0
- A=`find $1 -print`
- if expr $3 == 01 >/dev/null ; then OK=1 ; fi
- if expr $3 == 02 >/dev/null ; then OK=1 ; fi
- if expr $3 == 03 >/dev/null ; then OK=1 ; fi
- if expr $3 == 04 >/dev/null ; then OK=1 ; fi
- if expr $3 == 05 >/dev/null ; then OK=1 ; fi
- if expr $3 == 06 >/dev/null ; then OK=1 ; fi
- if expr $3 == 07 >/dev/null ; then OK=1 ; fi
- if expr $3 == 08 >/dev/null ; then OK=1 ; fi
- if expr $3 == 09 >/dev/null ; then OK=1 ; fi
- if expr $3 == 10 >/dev/null ; then OK=1 ; fi
- if expr $3 == 11 >/dev/null ; then OK=1 ; fi
- if expr $3 == 12 >/dev/null ; then OK=1 ; fi
- echo $A
- exit
- if expr $OK == 1 > /dev/null ; then
- ls -ld --full-time $A 2>/dev/null|grep $2| grep "$3-$4"|grep "$5";
- else
- echo Usage: $0 path Year Month Day;
- echo Example: $0 ~ 2011 06 30 11:10;
- fi
2.如何实现取出文件中特定的列内容
- 如果你只想看文件的前5行,可以使用head命令,
- 如: head -5 /etc/passwd
- 如果你想查看文件的后10行,可以使用tail命令,
- 如: tail -10 /etc/passwd
- 你知道怎么查看文件中间一段吗?你可以使用sed命令
- 如: sed -n '5,10p' /etc/passwd 这样你就可以只查看文件的第5行到第10行。
3.如何只列子目录?
- ls -F | grep /$ 或者 alias sub = "ls -F | grep /$"(linux)
- ls -l | grep "^d" 或者 ls -lL | grep "^d" (Solaris)
4.如何实现取出文件中特定的列内容
- 我们经常会遇到需要取出分字段的文件的某些特定字段,例如/etc/password就是通过“:”分隔各个字段的。可以通过cut命令来实现。例如,我们希望将系统账号名保存到特定的文件,就可以:
- cut -d: -f 1 /etc/passwd >; /tmp/users
- awk -F: '{print $1}' /etc/passwd
- -d用来定义分隔符,默认为tab键,-f表示需要取得哪个字段。
- 当然也可以通过cut取得文件中每行中特定的几个字符,例如:
- cut -c3-5 /etc/passwd
- 就是输出/etc/passwd文件中每行的第三到第五个字符。
- -c 和 -f 参数可以跟以下子参数:
- N 第N个字符或字段
- N- 从第一个字符或字段到文件结束
- N-M 从第N个到第M个字符或字段
- -M 从第一个到第N个字符或字段
5.打印uid大于500的用户 awk -F: '{if ($3>=500) print $1}' /etc/passwd
6.如何查找某条命令的相关库文件 在制作自己的发行版时经常需要判断某条命令需要哪些库文件的支持,以确保指定的命令在独立的系统内可以可靠的运行。 在Linux环境下通过ldd命令即可实现,在控制台执行: ldd /bin/ls 即可得到/bin/ls命令的相关库文件列表。
7.有些单词在一篇文章中经常会出现很多次,怎么统计这个单词的个数呢?! 如:文件kshfile,统计shell这个单词的个数,
$cat kshfile
ksh
The "Korn" shell, written by David Korn of AT&T Bell Labs (now Lucent). Written as a major upgrade to "sh", it is compatible with it, but has many more internal commands for the most frequently used functions. It also incorporates most of the same features from tcsh which enhance interactive use (command line history recall etc.). This shell is now available on most systems. It was slow to gain acceptance because earlier versions were encumbered by AT&T licensing.
$cat kshfile|tr " " "\n"|grep -wc shell
#tr " " "\n"用空格替代换行符,然后再统计行数,呵呵
8.#显示文件tmp的奇数行的内容:
[javalee//home/javalee/myshell]sed -n ‘1,$p;n’ tmp
aaaaaa
kasdkfkk
dfddf
asdfjklkas
#显示文件tmp的偶数行的内容:
[javalee//home/javalee/myshell]sed -n ‘1,$n;p’ tmp
dddddd
djhasdjf
kjsdfklkls
- n
- 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
- N
- 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
- p
- 打印模板块的行。
- P
- 打印模板块的第一行
9.技巧:倒读文本
例如文章:
$cat -n tmp
1 abcdefgh
2 123234234
3 sjdfk23423
1,行号倒序:
$cat -n tmp|tac #tac和cat很有趣吧~~
3 sjdfk23423
2 123234234
1 abcdefgh
2,每行倒读:
$cat tmp|rev
hgfedcba
432432321
32432kfdjs
3,全部倒过来:
$cat -n tmp|rev|tac
32432kfdjs 3
432432321 2
hgfedcba 1
10.删除文件中空行的几种方法
- 1,cat filename|tr -s '\n'
- 2,sed '/^$/d' filename
- 3,awk '{if($0!="")print}' filename
- 4,用grep也可以,但是比较麻烦
if -n str1 当字符串的长度大于0时为真
- if [ -n "`echo $1|sed -n '/^[0-9][0-9]*$/p'`" ]
- then
- echo " is number!"
- else
- echo " is not number!"
- fi
- 或者
- echo $1|awk '{if($0~/[^0-9]/) {print "'$1' is not number"} else{print "'$1' isnumber"}}'
12.查找特定字符所在行行号的方法
1.grep -n "string" filename
2.sed -n '/string/=' filename
3.awk '/string/{print FNR}' filename
13.查找一个关键词在整个文件中出现的次数
代码:
awk '/keyword/{count++}END{print count }' filename
替换
代码:
awk '{gsub(/oldstr/,"newstr");print}' filename
14.说明:expr在循环中用于增量计算。先将变量初始化为0,然后循环值加1,反引号的用法为命令替代。
> LOOP=0
> LOOP=`expr $LOOP + 1`
while语句测试:
1)
#!/bin/bash
m=0
while [ $m -lt 10 ]
do
echo $m
m=`expr $m + 1` #注意m旁边的空格,这里不能使用m="$m+1",好奇怪
done
2)
declare -i m=0 #别一种在算术运算时声明变量的方法,-i 定义为整数integer
while [ $m -lt 10 ]
do
echo $m
m=$m+1
done
until语句测试:
1)
#!/bin/bash
declare -i m=10
until [ $m -lt 10 ]
do
echo $m
m=$m-1
done
2)
declare -i m=0
while [ $m -lt 10 ]
do
echo $m
m=$m+1
done
15.shell一句话批量修改文件后缀
(1) $ for file in $(ls *.png);do mv $file `echo $file | sed s/jpg$/png/g`;done
(2) 更简单的:
$ rename png jpg *.png
(3) 用find更切题:
$ find . -name "*.jpg" | while read file; do mv $file $(echo $file|sed s/jpg$/png/g); done
当然也可以这么用:
$ for file in $(find . -name "*.png"); do mv $file $(echo $file|sed s/png$/jpg/g); done
16.用grep、xargs 、rm查找包含某字符串的文件并删除
grep -l "abc" ./* |xargs rm -rf
删除当前目录下包含“abc”的文件
find命令的例子;
2、让当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件,(Deven:注意{}之间没有空格,{}与\之前有一个空格);
$ find . -type f -perm 644 -exec ls -l {} \;
3、为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径;
$ find / -type f -size 0 -exec ls -l {} \;
4、查找/var/logs目录中更改时间在7日以前的普通文件,并在删除之前询问它们;
$ find /var/logs -type f -mtime +7 -ok rm {} \;
如果删除之前不需要询问则把-ok改为-exec就行了, find /var/log/ -type f -ctime +10 -exec rm {} \;
注意,删除之前也不会提示,请慎用: find /var/log/ -type f -ctime +10 |xargs rm;
如果问题改为:查找/data/目录中更改时间在10日以前的普通文件,但是/data/backup/目录中所有的文件都不删除;
find /data/ -type f -ctime +10|grep -v '/data/backup'|xargs rm
-exec: find命令对匹配的文件执行该参数所给出的s h e l l命令。相应命令的形式为
' command' {} \;,注意{ }和\;之间的空格,exec之后可以接很多命令。
find ./ -type f -print -exec chmod o+x {} \;
5、为了查找系统中所有属于root组的文件;
$find . -group root -exec ls -l {} \;
-rw-r--r-- 1 root root 595 10月 31 01:09 ./fie1
6、find命令将删除当目录中访问时间在7日以来、含有数字后缀的admin.log文件。
该命令只检查三位数字,所以相应文件的后缀不要超过999。先建几个admin.log*的文件 ,才能使用下面这个命令
$ find . -name "admin.log[0-9][0-9][0-9]" -atime -7 -ok rm {} \;
< rm ... ./admin.log001 > ? n
< rm ... ./admin.log002 > ? n
< rm ... ./admin.log042 > ? n
< rm ... ./admin.log942 > ? n
7、为了查找当前文件系统中的所有目录并排序;
$ find . -type d | sort
8.删除/data/目录下10天之前的文件,但是在filelist中的文件不能删除
find /data/ -type f -ctime +10;sort filelist > tmp2.txt
9.分 割
以符号+为准,将字符分割为左右两部分
使用sed
举例:
命令 date --rfc-3339 seconds 的输出为
2007-04-14 15:09:47+08:00
取其+左边的部分
date --rfc-3339 seconds | sed 's/+[0-9][0-9]:[0-9][0-9]//g'
输出为
2007-04-14 15:09:47
取+右边的部分(Deven:
. 匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。
* 匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。记住,以下这样写不行。date --rfc-3339 seconds | sed 's/*+//g')
date --rfc-3339 seconds | sed 's/.*+//g'
输出为
08:00
以 空格为分割符的字符串分割
使用awk
举例:
STR_FRUIT="Banana 0.89 100"
取第3字段
echo $STR_FRUIT | awk '{ print $3;}'
Linux shell 截取字符变量的前8位,有方法如下:
expr substr “$a” 1 8
2、第二种方法:${varible:n1:n2}:截 取变量varible从n1到n2之间的字符串。
可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在 bash 中输入以下行:
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:7}
abunga
这种形式的字符串截断非常简便,只需用冒号分开来指定起始字符和子字符串 长度。
三、按照指定要求分割:
比如获取后缀名
ls -al | cut -d "." -f2
10.统计deven.txt各行总和,deven.txt格式如下:
4
5
6
77
888
999
000
3.#对字符串进行大写转换
cat test.txt|awk '{print toupper($0)}'
或者cat test.txt |tr '[a-z]' '[A-Z]'