一、shell的种类:
linux上有好几种shell 可以使用,脚本的开头#!/bin/bash指定该脚本为bash执行;而我们终端默认的是sh,通过ll /bin/sh可以看到指向的是dash,在不同的shell下命令的一些选项意义会有些许不同,在执行脚本的时候指定shell,如sh test.sh是使用默认的shell,bash test.sh是指定bash。
二、grep的使用:
grep是linux一个特别常用的指令,主要就是对文本就行模式查找;
grep的常用选项:
-c 显示匹配的行数;
-i 忽略大小写
-h 查询多文件时不显示文件名
-l 查询多文件时只输出包含匹配字符的文件名
-n 显示匹配行及行号
-v 显示非匹配的文本行
精确匹配可以在字符串后面加上“\>”,如grep “android\>” test.txt,但是在观察中发现,精确匹配只对关键的末尾进行匹配,如echo “android” | grep "oid\>" 是可以匹配的,但是echo “android” | grep "and\>"就是无法匹配的,在使用中需要注意;
正则模式匹配,模式匹配需使用单引号,如 grep '[0-9]\{3\}[8]' test.txt,其中具体的正则表达式可以根据不同情况去写入不同的;
匹配“或”“与”,如grep -E '219|216' text.txt;
显示匹配内容--color=always
正则表达式:
^:匹配开头,如
$:匹配结尾,
.:陪任意一个单字符
*:一个单字符后紧跟*,匹配0个或者多个此单字符;
[]:匹配[]内字符,[abc]匹配a或者b或者c,[a-c]匹配同上;
[^]:匹配非[]内字符,[^abc]匹配a或者b或者c,[^a-c]匹配同上;
pattern\{n\}:匹配模式n次
pattern\{n,\}:匹配模式至少n次
pattern\{n,m}:匹配模式n到m次
三、命令执行顺序
&&:减少判断语句:如cp a b && rm -r a;这是如果cp操作失败则不会删除a,如果是常规写法
cp a b;
rm -r a;此时如果cp失败,则很有可能会误删a,导致一些不好的后果,如果加上一些结果判断代码就会很冗杂;
||:如 cp a b || sendmail XX,如上类似;
四、sort、uniq、cut的使用:
-c 测试是否已分类-m 合并俩个分类文件-u 去重-o 输出文件-b 使用域分类忽略第一个空格-n 指定数字分类-t 指定分割符-r 逆序排列+n 从第n个域开始排序n 分类是忽略此域post1 传递m,n m为域号,n为分类字符数,表示从第m+1个域开始第n+1个字符开始排序-k指定第 1指定第一个域与前面不同
sort -c 测试是否已经分类成功;sort -t:-r 按照“:”分割 逆序排列sort +1n 按照第二列排序 按照数字域
处理与重复行相关的操作,unique处理的重复行是相邻的,如果不相邻的两个一样的算不重复;uniq -u d c -f inputfile outputfile-u只显示不重复的行-d只显示有重复数据行每种重复行显示一行-c 打印每一行重复出现次数f表示前n个域被忽略
五、awk的使用:
awk是一个非常有用的文本处理工具,对于格式化的语句处理有很好的应用;awk处理的文本一般是格式化的,即用域分隔符划分抽取域,分隔符可能是任意字符;
awk调用一般有三种方法:命令行,写入一个文件用awk命令解释器执行,所有awk命令插入一个单独文件然后调用;我目前使用较多的情况是第一种,直接作为一个命令来使用:awk -F '分隔符' '命令行' 输入文件
awk执行每次读一条记录或者一行,每一行按照给定的分隔符分为若干个域,如果不指定分隔符则默认分隔符空格,
在awk中第一个域为$1,依次类推,如awk -F "#" '{print $1}' data.txt 打印第一个列;$0代表所有列;awk执行分为3个阶段,awk ’BEGIN{print “------”}{print $0}END{print "-----"}‘BEGIN在所有文本处理工作开始前执行,可以打印一些信息,主要是做一些变量的初始化,END在所有文本处理结束后执行,主要对输出进行处理;
awk中的正则匹配:awk中可以让指定的域去匹配模式,如awk ’{if($4~/Brwon/) print $0;}‘ data.txt表示$4匹配Brown,如果不匹配的话则awk ’{if($4!~/Brwon/) print $0;}‘ data.txt,可以在条件中添加其他正则表达式,得到不同的记录
awk中有很多内置的变量信息:
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行- F选项
NF 浏览记录的域个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
1.文件处理:
awk中操作符与C语言类似,
hit:设置可以设置输入域为变量名,方便理解意义;
awk中的变量:awk中的变量是一直记录的直到文件处理结束,例如
awk 'BEGIN{total=3}{total+=$6}END{print total}'
会一直累加第六列的数值,一直到最后记录处理结束;
内置的字符串函数:
sprint(fmt,exp);有错,应为printf(fmt,exp);
gsub允许使用正则表达式去匹配相关字符串;
match的第二个参数可以使用正则表达式来匹配;
awk中可以传递变量,例如awk '{print age}' age=15 test.txt
awk中的数组:
awk中数组不需要定义,下标也不定是数字,可以类似key-value对;
例如统计一个文本中需要一个字符的数量:
awk '{k[$1]++}END{for(i in k) print i,k[i]}';
重定向与管道:
awk可以将结果重定向的一个文件中,例:awk '$1 = 100 {print $1 > "output_file" }' test,也可以使用>>追加操作;
也可以将文件中的内容重定向到awk中,例如:awk 'BEGIN{while("cat aa" | getline d) {a[d]}}';
条件控制及循环:
与C语言中类似;但是没有switch函数;
http://man.lupaworld.com/content/manage/ringkee/awk.htm
六、sed的使用:
与awk类似,sed是另一个文本编辑工具,awk和sed都不会对原始文件进行改变,他们操作的都是一个拷贝,没有重定向的话会被输出到屏幕;
使用sed的命令为:sed [选项] 'sed命令'。
sed的选项有:
-e 允许多台编辑;
-h 打印help文档
-n 取消默认输出
-f 引导脚本文件名
sed处理文本可以指定处理文本的范围,定位范围的方式如下:
sed有很多编辑命令可以满足文本处理的很多任务:
比较常用的编辑功能有:
a\在定位行或者模式后面添加新文本信息
i\在匹配的行前插入与a类似;
c\对匹配的行全部替换;
d\删除匹配的行;
s\替换文本:
替换脚本后可跟()
& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\(..\) 保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers-
$ sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
-
$ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
-
$ sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加localhost,变成192.168.0.1localhost。
-
$ sed -n 's/\(love\)able/\1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
-
$ sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100
- $ sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换
- n命令 $ sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。
name=zhang;sed "s/$name/li/";
与sed类似还有个处理文本的命令式TR,tr的大部分功能都可以由sed完成,因此不做深入;
http://man.lupaworld.com/content/manage/ringkee/sed.htm
后台执行命令的使用:
&命令:一般执行类似下载或者系统处理的一些命令,需要等待很长时间的可以放到后台去执行,利用&命令可以实现类似多线程的功能;
执行压缩指令需要很长时间,而且多个压缩命令可以同时执行,可以将几个压缩操作同时执行,但是不能一次性提交太多的后台指令,一般提交一定数量的后台操作后执行wait命令,等待后台操作执行完毕。
basename:取文件名
dirname:取目录名
控制流语句:
if语句:
格式:
if 条件
then
命令
elif
then
命令
else
命令
fi
条件:
逻辑操作:-a 逻辑与,-o 逻辑或,!逻辑非;
数值检测:
字符串检测:
例子1:
if [ -z $NAME ];then
echo "name is null"
fi
例子2:
if [ "$NAME" = "zhang" ];then
echo "success!"
fi
例子3:if echo $NAME | grep "zhang" > /dev/null 2>&1
echo "success!"
fi
例子4:if cp myfile myfile.bk > /dev/null 2>&1
echo "success!"
else
echo "`basename $0`:error!"
fi
例子5:if [ "`ls $FILEPATH`" = "" ];then
echo "no files"
fi
case语句:
格式:
case 值 in
模式1)
命令1
;;
模式2)
命令2
;;
esac
例子1:
case $NUM in
1)echo "select 1"
;;
2)echo "select 2"
;;
*)echo "select no"
;;
esac
例子2:使用“|”符号
case $NUM in
y|Y|yes|YES)echo "select yes"
;;
n|N|no|NO)echo "select no"
;;
*)echo " no input"
;;
esac
for循环语句:
格式1:
for loop in 1 2 3 4 5
do
命令
done
格式2:
for (( i=0; i< 5; i++))
do
命令
done
例子1:使用命令行参数时候不需要使用in列表
for param
do
echo "input is $param"
done
while循环语句:
格式1:
while 条件
do
命令
done
例子1:循环读取文件中每行数据,使用IFS变量设置分隔符
SAVEDIFS=$IFS
IFS=:
while read NAME ID
do
echo "$NAME \t ID"
done<name.txt
IFS=$SAVEDIFS
shell函数:
格式:
function 函数名(){
命令行
}
函数的参数不需要在()定义,与其他编程语言不一样;
function hello(){
echo $0,$1,$2,$3,$4,$5;
}
hello a b c d
显示"脚本名字 a b c d ";
函数返回可以使用return;return返回的是函数执行状态的值,0表示成功,其他表示错误,跟其他语言的返回值不一样。
hadoop相关指令:sum(){echo $(($1+$2))return $(($1-$2))}sum $1 $2c=$(sum $1 $2)echo $?echo $c
使用方法:hadoop fs -cp URI [URI …] <dest>
将文件从源路径复制到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。
示例:
- hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2
- hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir