Linux脚本攻略(2)——命令之乐

1.用cat进行拼接

将多个文件内容拼接在一起

cat file1 file2 file3 #将三个文件的内容拼接在一起作为输出

使用cat压缩空白行

cat -s file 

2.使用script、scriptplay录制与回放终端回话

步骤1:录制

inux-code#script -t 2> time.log -a action.log

-t选项将命令执行的时序数据导入stderr。我们通过2> time.log将命令时序 信息重定向到time.log,而action.log文件中则保存了命令输出信息。通过输

入exit结束录制。

步骤2:回放

linux-code#scriptreplay time.log action.log

结合time.log和action.log内容进行回放。

3.在多个用户之间进行视频会话广播

步骤1:在终端1上建立fifo文件

linux-code#mkfifo scriptfifo

步骤2:在终端2上监听scriptfifo

linux-code#cat scriptfifo

步骤3:返回终端1,在其上进行录制操作

linux-code#script -f scriptfifo

可以输入exit结束录制。

此后,终端1便扮演了广播员的角色,而终端2会成为它的一个听众。

有点意思啊!

4.文件查找命令find

在目录/tmp重查找以.txt为后缀的所有文件

linux-code#find /tmp -name “*.txt” -print

Find命令的或操作,在目录/tmp重查找以.txt和.pdf为后缀的所有文件

linux-code#find /tmp \( -name  “*.txt”  -o  -name  “*.pdf”  \)  -print

要注意括号后要有空格。

路径匹配,匹配包含特定字符的路径。

linux-code#find  /home/viidiot -path “*test” -print

此外,可以通过-regex选项来基于正则表达式进行匹配。

通过type来搜索特定类型的文件,比如

查找普通文件:linux-code#find  /home/viidiot -type f  -print

查找链接文件:linux-code#find  /home/viidiot -type l  -print

打印出最近7天内访问的文件

linux-code#find  /home/viidiot -type f -atime -7 -print

查找比file.txt文件更新的文件

linux-code#find  /home/viidiot -type f -newer file.txt -print

查找文件大小大于2KB的文件

linux-code#find  /home/viidiot -type f -size +2k

查找文件大小于2KB的文件

linux-code#find  /home/viidiot -type f -size -2k

删除当前目录下所有.swp文件

linux-code#find . -type f -name  “*.swp” -delete

查找具有特定权限的文件

linux-code#find /home/viidiot -type f -perm 640 -print

查找用户viidiot拥有的文件

linux-code#find .  -type f -user viidiot -print

 

Find命令与-exec结合使用:

将当前目录中所有.c文件拼接起来存入all_c_files.txt中

linux-code#find . -type f -name “*.c” -exec cat {} \; > all_c_files.txt

{}表示一个匹配,对于任何一个匹配的文件名,{}会被该文件名替换。

将10天前的.txt文件复制到OLD目录中

linux-code#find . -type f -mtime +10 -name “*.txt” -exec cp {} OLD \;

5.参数格式化命令xargs

xargs命令把从stdin接收到的数据进行格式,再将其作为参数提供给其他命

令使用。

比如,将多行输入转换成单行输出

linux-code# cat tmp.txt 

1 2 3

4 5 6

7 8 9

linux-code# cat tmp.txt | xargs 

1 2 3 4 5 6 7 8 9

根据定界符来分隔参数

linux-code#echo "hiXhiXhiXhi" | xargs -d X

hi hi hi hi 

结合n选项来将输入分隔成多行

linux-code#echo "hiXhiXhiXhi" | xargs -d X -n 2

hi hi

hi hi

6.用tr(translate)命令进行转换

tr命令对来自标准输入的字符进行替换、删除以及压缩。

命令格式:tr [options] set1 set2

将输入字符由大写转换为小写

linux-code# echo "HELLO,LINUX-CODE" | tr "A-Z" "a-z"

hello,linux-code

用tr删除字符

linux-code#echo "HELLO,LINUX-CODE 123" | tr -d "0-9"

HELLO,LINUX-CODE 

-c选项用来使用字符集的补集,比如

从输入文本中将不在字符中的所有字符全部删除

linux-code#echo "HELLO,LINUX-CODE 123" | tr -d -c "0-9\n"

123

-s选项用于压缩字符,比如

将文本中多个连续空格压缩成一个空格

linux-code# echo "HELLO   LINUX-CODE    " | tr -s " "

HELLO LINUX-CODE

7.排序

sort命令选项-n用来指明按数字进行排序,-r选项表示逆序排序,-k选项指

定按哪一类进行排序。

按数字对文件进行排序

sort -n file.txt

按月份进行排序

sort -M file.txt

将文件file.txt按第二列按数字进行逆序排序

sort -nrk 2 file.txt

8.去重

uniq命令用于消除重复内容。

去除文件中重复的行

uniq file.txt

对文件中内容进行排序后再去重

sort file.txt | uniq

找出文件中重复的行

sort file.txt | uniq -d

统计一个字符串中每个字符出现的次数,比如

输入:aabcdeeeffccc

输出:2a1b4c1d3e2f

INPUT=”aabcdeeeffccc”

linux-code# IN="ahebhaaa"

linux-code#OUT=`echo $IN | sed 's/[^\n]/&\n'/g |sed '/^$/d'|sort|uniq -c |tr -d ' \n'`

linux-code# echo $OUT

4a1b1e2h

注释:

sed 's/[^\n]/&\n'/g将每个字符后追加一个换行符,使得每行只有一个字符,方便sort命令排序。

sed '/^$/d'用于删除最后那个字符后的空行。

uniq -c用于统计每一行重复次数。

tr -d ' \n'将输入中的空格与换行符删除。

9.临时文件与随机数

创建临时文件,三种常用方法

tmp_file=$(tempfile)

tmp_file=”/tmp/file-$RANDOM”

tmp_file=”/tmp/var.$$”

10.批量重命名

用特定的格式重命名当前目录下所有jpg 和png 文件

#!/bin/bash

#Filename: rename.sh

#Desc: Rename jpg and png files

count=1;

for img in `find . -iname '*.png' -o -iname '*.jpg' -type f -maxdepth 1`

do

  new=image-$count.${img##*.}

  echo "Renaming $img to $new"

  mv "$img" "$new"

  let count++

done 

注释:${img##*.}用于对处于当前循环中的文件名进行解析获取文件扩展名。

其他重命名方法

将*.JPG更名为*.jpg

rename *.JPG  *.jpg

将文件名中的空格替换成字符‘_’

rename  ‘s/ /_/g’  *

将文件名中大写字母改成小写

rename  ‘y/A-Z/a-z/g’  *

将所有文件名中的空格替换为字符‘_’

Find path -type f -exec rename ‘s/ /_/g’ {} \;

11.拼写检查

检查某个单词是否为词典中的单词

#!/bin/bash
#Filename: checkword.sh
word=$1
grep "^$1$" /usr/share/dict/british-english -q 
if [ $? -eq 0 ]; then
  echo $word is a dictionary word;
else
  echo $word is not a dictionary word;
fi

注释:grep中,^标记单词的开头,$标记单词的结尾。

例如:

linux-code#./checkword.sh hel

hel is not a dictionary word

linux-code#./checkword.sh linux

linux is not a dictionary word

linux-code#./checkword.sh kidding

kidding is a dictionary word

此外,也可以使用aspell list来检查单词是否在词典中

#!/bin/bash 

#Filename: aspellcheck.sh

word=$1 

output=`echo \"$word\" | aspell list` 

if [ -z $output ]; then 

        echo $word is a dictionary word; 

else 

        echo $word is not a dictionary word; 

fi 

例如:

linux-code#./aspellcheck.sh linux

linux is not a dictionary word

linux-code#./aspellcheck.sh good

good is a dictionary word

12.交互式输入

#!/bin/bash

#Filename: interactive.sh

read -p "Enter number:" no ;

read -p "Enter name:" name

echo You have entered $no, $name;

该脚本运行结果如下:

linux-code#./interactive.sh 

Enter number:1

Enter name:viidiot

You have entered 1, viidiot

也可以用如下方法向脚本自动发送输入:

linux-code#echo -e "1\nviidiot\n" | ./interactive.sh 

You have entered 1, viidiot

如果制作了输入文件,还可以通过输入重定向,从文件中导入交互式输入数

据,如:

linux-code#cat input.data 

1

viidiot

linux-code#./interactive.sh <input.data 

You have entered 1, viidiot

 

你可能感兴趣的:(linux)