shell&awk

awk记录

NF:多少列 

NR:多少行

##awk中使用shell变量

$echo $sql_query
$query_result=`echo $sql_query | $sql_cmd | sed -n '2p'`

$echo $query_result | awk -F',' -v nuser=$localuser '\
{
    print nuser
    for (i = 0; i <= NF; i++)
    {
        ##判断是否相等
        if($i == nuser)    { print $i }
    }
}

多个分隔符

## one 和 | 作为分隔符
$echo 'woonea|aoaoaoaonebboneb:iooneii:' |awk -F'one|:' '{print NF}'

将两个文件按列合并

 file01:
   1  1
   2  2
   3  3
   4  4
   5  5
 file02:
   a  a
   b  b
   c  c
   d  d
   e  e

第一种 使用awk

$ awk 'NR==FNR{a[i]=$0;i++}NR>FNR{print a[j]" "$0;j++}' file01 file02

第二种 使用paste

$ paste -d " " file01 file02


拆分合并某列行

$ awk 'NR<4{a[i]=$0;i++}NR>3{print a[j] "\t" $0;j++}' file01

删除文件中的空行

$sed '/^$/d' file

$grep . data.txt
$grep -v '^$' data.txt
$grep '[^$]' data.txt

$awk NF file        //这个也可以将空格、tab等组成的空行删掉
$awk '!/^$/' file

删除/替换文件末尾换行符

$cat file | tr '\n' ' ' 

$sed ':a;N;$!ba;s/\n/ /g'  file          

:a;  这是一个标签,用来实现跳转处理,名字可以随便取(a),后面的b a就是跳转指令
N;  N是sed的一个处理命令,追加文本流中的下一行到模式空间进行合并处理,因此是换行符可见
s/\n/:/;   s是sed的替换命令,将换行符替换为空格
b a  或者 t a    b / t 是sed的跳转命令,跳转到指定的标签处
$!不包含file的最后一行

数据计算

1、let

该命令可以直接执行基本的算数计算。当使用let时,变量名之前不许要再添加$。

let   result=num1+num2

#!/bin/bash  
a=5  
b=6  
let result=a*b  
echo $result  
let result*=result #注意此行,变量与符号之间不能有空格  
echo "the result is $result"

结果为: the result is 900

2、操作符[]

result=$[num1+num2 ]注意等号两边不能有空格

在[]中也可以用$前缀。

#!/bin/bash  
a=5  
b=6  
result=$[a+b ]  
echo "The result is $result"  
result=$[$a+$a ]  
echo "the result is $result"

结果为

The result is 11

the result is 10

3、使用(())也可以进行计算,但在使用(())时,变量名前需要加上$

result=$((num1 +num2 ))

#!/bin/sh  
num1=5  
num2=6  
result=$((num1+num2))  
echo "the result is $result"

4、expr同样可以用于基本的数据操作

result=`expr4+5`

result=$(expr$num1+2

以上这些方法只能用与整数的计算,而不支持浮点数的计算

备注

bc是一个用于数学运算的高级工具。这是一个精密计算器包含了大量的选项。我们可以借助它执行浮点数运算,并应用一些高级函数

echo "4*6.4" |bc

设定小数精度。参数scale=2将小数位数个数设置为2

echo "scale=2;13/8" | bc

用bc进行进制转换。进制转换设置参数obase=进制数。

#!/bin/bash  
no=100  
echo "obase=2;$no" |bc  
no=111111  
echo "obase=10;ibase=2;$no" | bc 

用bc计算平方及平方根

#echo "sqrt(100)" | bc

shell脚本加密

要保护自己编写的shell脚本程序,方法有很多,最简单的方法有两种:1)加密; 2)设定过期时间; 

shc是一个加密shell脚本的工具.它的作用是把shell脚本转换为一个可执行的二进制文件,下载安装shc加密工具

#shc -v -f test.sh
# ll test*
-rwxr-xr-x   1 oracle oinstall    1178 Aug 18 10:00 test.sh
-rwx--x--x   1 oracle oinstall    8984 Aug 18 18:01 test.sh.x
-rw-r--r--   1 oracle oinstall   14820 Aug 18 18:01 test.sh.x.c

# file test.sh.x
test.sh.x: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped

可以看到生成了动态链接可执行二进制文件test.sh.x和C源文件testup.sh.x.c, 注意生成的二进制文件因为是动态链接形式, 所以在其它平台上不能运行.

可以通过下面的方法生成一个静态链接的二进制可执行文件:

$ CFLAGS=-static shc -r -f test.sh

$ file testup.sh.x

shell if参数格式

–b : 当file存在并且是块文件时返回真
-c : 当file存在并且是字符文件时返回真
-d : 当pathname存在并且是一个目录时返回真
-e : 当pathname指定的文件或目录存在时返回真
-f : 当file存在并且是正规文件时返回真
-g : 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真
-h : 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
-k : 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
-p : 当file存在并且是命令管道时返回为真
-r : 当由pathname指定的文件或目录存在并且可读时返回为真
-s : 当file存在文件大小大于0时返回真
-u : 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
-w : 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的
-o : 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真
更为详细的说明
-e filename 如果 filename 存在,则为真[ -e /var/log/syslog ]
-d filename 如果 filename 为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename 为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename 为符号链接,则为真[ -L /usr/bin/grep ]
-r filename 如果 filename 可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename 可写,则为真 [ -w /var/mytmp.txt ]
-x filename 如果 filename 可执行,则为真 [ -L /usr/bin/grep ] 
#字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z string 如果 string 长度为零,则为真 [ -z $myvar ]
-n string 如果 string 长度非零,则为真 [ -n $myvar ]
string1 = string2  如果 string1 与 string2 相同,则为真[ $myvar = one two three ]
string1 != string2 如果 string1 与 string2 不同,则为真 [ $myvar != one two three ]

#算术比较运算符
num1 -eq num2 等于[ 3 -eq $mynum ]
num1 -ne num2 不等于 [ 3 -ne $mynum ]
num1 -lt num2 小于 [ 3 -lt $mynum ]
num1 -le num2 小于或等于 [ 3 -le $mynum ]
num1 -gt num2 大于 [ 3 -gt $mynum ]
num1 -ge num2 大于或等于 [ 3 -ge $mynum ]

位置参数 $1, $2,..., $N;
$#代表了命令行的参数数量;
$0代表了脚本的名字,第一个参数代表$1,第二个参数代表$2.

if条件判断

[ -f "/etc/shadow" ]  echo "uses shadow"  //如果左边的表达式为真则执行右边的语句
[ -f /var/dhcpd.pid ]  rm /var/dhcpd.pid  //检查文件是否存在,如果存在就删掉

#[ ] 和  [[ ]] 的区别
[[ $a == z* ]]       如果$a以z开头,那么匹配成功
[[ $a == "z*" ]]     如果$a等于z*(字符串)
[ $a == z* ]         file globbing 和 world spilitting将会发生
[ "$a" == "z*" ]     如果$a等于“z*”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值