shell基于日常工作需要 【黏贴即用】

需要转义的字符

正则需要转义字符:'$', '(', ')', '*', '+', '.', '[', ']', '?', '\', '^', '{', '}', '|'

awk

A.按照“|”切分,并输出指定列数的行的第一个字段
 awk -F '|' '{if(NF==3) print $1 $2 }'

1.表示:以"|"分割,分割后字段等于3的,输出第一、二字段; 2.NF表示切分后的字段个数

B.print 输出用 $+数字,索引字段,一个print 可紧跟多个字段输出

例如

 awk -F '|' '{if(NF==3) print $1 $2 $3 }'
C.带if语句判断符合条件字段输出,注意:小心勿用 = ,否则显示的数据是被替换的
 awk -F '|' '{if($1 == 2 && $2 != 1) print $1 $2 $3 }'
D.awk切分后输出,并以新的分隔符输出
 awk -v OFS='|' '{$1=$1; print}'

其中,$1=$1,表示行的内容发生变化后OFS就生效了,不然OFS不给生效

普通版

awk -vOFS="\t" '{$1=$1}1' inputfile

循环版

awk '{for(i=0;i++<NF;){a=i==NF?$i"\n":$i"\t";printf a}}' inputfile

sort

A.找第三字段为某值时,并按照第五字段排序,唯一输出:
   awk -F '|' '{if ($3 == 123) print } ' | sort -k 5 -t "|"
B.以“|”切分,第一字段>=10,然后输出第二字段,并排序去重统计**。
  awk -F '|' '{if($1 >= 10) print $2}'|sort -u|wc -l

grep

A.统计切分一行,以2-3位数字开头的数据,统计条数
cat file.txt |awk -F '|'  '{print $4}'|grep '^[0-9]\{2,3\}'|wc -l
grep '^[0-9]\{2,3\}'|egrep -e "226" |grep -e ":"
A.1 打印不以“A”开头的数据行
    cat file.txt | grep "^[^A]"

A.2 只打印某些完全符合的列

cat file.txt|egrep -w -e "54043"

-w --word-regexp #只显示全字符合的列。

-x --line-regexp #只显示全列符合的列。

cut

1.截取前几字符

cut -b 3

实用


1.省市拼音与汉字对应表【字典结构】与应用
  • 1.包含中间值保留并应用;
  • 2.省份拼音列表
  • 3.省份拼音与汉字对应字典
#声明 字典结构
declare -A dicA

#字典结构
dicA=([neimenggu]="内蒙古自治区" [guangdong]="广东省" [hainan]="海南省" [qinghai]="青海省" [gansu]="甘肃省" [jilin]="吉林省" [beijing]="北京市" [chongqing]="重庆市" [ningxia]="宁夏回族自治区" [hubei]="湖北省" [hunan]="湖南省" [anhui]="安徽省" [shanxisheng]="陕西省" [guangxi]="广西壮族自治区" [yunnan]="云南省" [shanghai]="上海市" [jiangxi]="江西省" [shanxi]="山西省" [fujian]="福建省" [guizhou]="贵州省" [hebei]="河北省" [heilongjiang]="黑龙江省" [henan]="河南省" [jiangsu]="江苏省" [liaoning]="辽宁省" [shandong]="山东省" [sichuan]="四川省" [tianjin]="天津市" [xinjiang]="新疆维吾尔自治区" [xizang]="西藏自治区" [zhejiang]="浙江省")

day="01 10 19 28"

#身份拼音列表
es="anhui beijing chongqing fujian gansu guangdong guangxi guizhou hainan hebei heilongjiang henan hubei hunan jiangsu jiangxi jilin liaoning neimenggu ningxia qinghai shandong shanghai shanxi shanxisheng sichuan tianjin xinjiang xizang yunnan zhejiang"
for pro  in $es
do
{
  echo " ${dicA[ "${pro}" ] } is running "
  for das in $day  
  do
  {
#核心但愿
   value=`cat ./$date${das}_${dicA["${pro}"]}.txt |awk -F '|'  '{print $4}'|grep '^[0-9]\{2,3\}'|wc -l`
   all=`cat ./$date${das}_${dicA["${pro}"]}.txt |wc -l`
   per=`awk 'BEGIN{printf "%.1f%%\n",('$value'/'$all')*100}'`
   echo "${dicA["${pro}"]}, $date${das},${all},${value},${per}" >> 19.txt
  }
  done
}
done
    

2.中间值保留并应用
 a=38
 b=99
 percent_1=$(printf "%d%%" $((a*100/b)))
 # 或者
 percent_2=`awk 'BEGIN{printf "%.1f%%\n",('$a'/'$b')*100}'`
 # 保留1位小数,四舍五入
 echo $percent_1
 echo $percent_2
  • 其中 %.1%% 表示浮点型输出表留1位小数。 结果如下:

1 percent_1=38%

2 percent_2=38.4%


3.统计某一列或组合列的种类对应的数量
wang|2|9
wang|2|4
zhang|2|l
hanna|3|2
zhang|2|3

应用:

#统计某一列
less result.txt | awk -F '|' '{k=$12; if(k in X){X[k] ++} else{X[k] = 1} } END{for(k in X){print k"|"X[k]}}' > devicePV.txt
                              12          相同的累加   找不到话就=1    

#统计两列组合种类个数
less result.txt | awk -F '|' '{k=$2"|"$3; if(k in X){X[k] ++} else{X[k] = 1} } END{for(k in X){print k"|"X[k]}}' > test.txt
                        23列组合在一起统计

结果:

wang|2
zhang|2
hanna|1

4.对某列个数求和
  cat devicePV.txt |awk -F '|' '{sum+=$2} END {print sum}'
5.把一个文件内容作为条件去另一个文件中grep
for line in `cat phone.txt`;do grep $line `hdfs dfs -text /user/JiuQianProject/yunhe/after_recovery/*/final/huixitong/day/mid/*/011/yhbank/*`;done >> pv.txt

6.sed怒不敢看

删除第几行开始的后面数据后并输出屏幕
....#输出删除后的样子,但不修改源文件
    sed '3,$d' filename.txt
    
    #修改源文件
    sed -i '4,$d' filename.txt
    sed -i '1d' se_beijing.txt 
芳蓉出品:省份汉字转拼音
删除行尾空行
sed 's/[ \t]*$//'  data.txt

中文省份变英文,首先你要有中文

sed 's/|安徽|/|anhui|/g' | sed 's/|北京|/|beijing|/g' | sed 's/|重庆|/|chongqing|/g' | sed 's/|福建|/|fujian|/g' | sed 's/|甘肃|/|gansu|/g'| sed 's/|广东|/|guangdong|/g'| sed 's/|广西|/|guangxi|/g'| sed 's/|贵州|/|guizhou|/g'| sed 's/|海南|/|hainan|/g'| sed 's/|河北|/|hebei|/g'| sed 's/|黑龙江|/|heilongjiang|/g'| sed 's/|河南|/|henan|/g'| sed 's/|湖北|/|hubei|/g'| sed 's/|湖南|/|hunan|/g'| sed 's/|江苏|/|jiangsu|/g'| sed 's/|江西|/|jiangxi|/g'| sed 's/|吉林|/|jilin|/g'| sed 's/|辽宁|/|liaoning|/g'| sed 's/|内蒙古|/|neimenggu|/g'| sed 's/|宁夏|/|ningxia|/g'| sed 's/|青海|/|qinghai|/g'| sed 's/|山东|/|shandong|/g'| sed 's/|上海|/|shanghai|/g'| sed 's/|山西|/|shanxi|/g'| sed 's/|陕西|/|shanxisheng|/g'| sed 's/|四川|/|sichuan|/g'| sed 's/|天津|/|tianjin|/g'| sed 's/|新疆|/|xinjiang|/g'| sed 's/|西藏|/|xizang|/g'| sed 's/|云南|/|yunnan|/g'| sed 's/|浙江|/|zhejiang|/g' 
输出文件的偶数行

怎样输出一个文件里所有的奇数行或所有的偶数行的命令求解释。功能实现了但是不懂意思

1.awk 'NR%2==0' file 
2.sed -n '1,$n;p' file
3.sed -n '1,$p;n' file
4.奇数行:sed '2~2d' file
5.偶数行:sed '1~2d' file

7.将windos下文件转utf-8

如果文件中出现了<U+FEFF>则文件出现了爆头,需要进行如下处理:

[Windows] dos2unix.exe filename
[Unix]    dos2unix filename

8.集群sftp无法上传数据时,解决:

1.管理员权限运行cmd;

2.执行:netsh interface ipv4 set subinterface "以太网" mtu=1400 store=persistent;
以太网,为本地连接

9.删除文件中空行

方法一:利用grep

grep -v '^\s*$' test.txt

注:-v表示将匹配的结果进行反转,正则表达式匹配空行。(空行可包括空格符制表符等空白字符)

方法二:利用sed

sed '/^\s*$/d' test.txt

注:d代表删除该行

方法三:利用awk

awk NF test.txt

注:NF代表当前行的字段数,空行的话字段数为0,被awk解释为假,因此不进行输出。

以上三种方式均可处理包含空白字符(空格符,制表符等)的空行。

方法四:若空行均由’\n'造成,则还可以利用tr命令去除空行

tr -s '\n' < test.txt

注:-s代表将多个连续的字符压缩成一个字符,这里是将多个‘\n'压缩成一个'\n',达到去除空行的效果。

10.if 判断变量是否为空

    if  [ ! -n "$word" ] ;then
    echo "you have not input a word!"
else
    echo "the word you input is $word"
fi

if 多条件

  • 与:-a,当指定多个条件时,默认为与关系
  • 或:-o
  • 非:!,这是个单目操作符
基本的if条件命令选项有: 
-eq —比较两个参数是否相等(例如,if [ 2 eq 5 ]
-ne —比较两个参数是否不相等 
-lt —参数1是否小于参数2 
-le —参数1是否小于等于参数2 
-gt —参数1是否大于参数2 
-ge —参数1是否大于等于参数2 
-f  检查某文件是否存在(例如,if [ -f "filename" ] 
-d  检查目录是否存在 

判断路径是否存在

if [ ! -d "$folder" ] ; then
  mkdir "$folder"
fi

异常捕获

#!/bin/bash
ls liqiu > /tmp/error 2>&1 #使用 " 2>&1" 把标准错误 stderr 重定向到标准输出 stdout 
echo $? #捕获上一条命令的输出 (if 0 正常 else 错误)
ls -l > /tmp/log
echo $?

if报错


shell脚本报错:"[: =: unary operator expected"
转载 20110623 22:52:00 标签:shell /脚本 108808
    shell脚本报错:"[: =: unary operator expected"

    在匹配字符串相等时,我用了类似这样的语句:

if [ $STATUS == "OK" ]; then     

echo "OK"

fi

    在运行时出现了 [: =: unary operator expected 的错误,就一直找不到原因,尝试了删除等号两侧的空格和括号里的空格都不管用,最后baidu了一下,才找到原因。把语句改成这样就不会出错了.

if [[ $STATUS = "OK" ]]; 

then     

echo "OK"

fi

    究其原因,是因为如果变量STATUS值为空,那么就成了 [ = "OK"] ,显然 [  "OK" 不相等并且缺少了 [ 符号,所以报了这样的错误。当然不总是出错,如果变量STATUS值不为空,程序就正常了,所以这样的错误还是很隐蔽的。

    或者用下面的方法也能避免这种错 误:if [ "$STATUS"x == "OK"x ]; then     echo

"OK"fi。当然,x也可以是其他字符。顺便提一点,shell中有没有双引号在很多情况下是一致的。

 

11.shell map

shellmap的使用和遍历
原创 20150120 16:54:42 12920
定义一个空map
[plain] view plain copy
declare -A map=()  

定义时初始化map
[plain] view plain copy
declare -A map=(["100"]="1" ["200"]="2")  
输出所有key
[plain] view plain copy
echo ${!map[@]}  
输出所有value
[plain] view plain copy
echo ${map[@]}  
添加值
[plain] view plain copy
map["300"]="3"  
输出key对应的值
[plain] view plain copy
echo ${map["100"]}  
遍历map
[plain] view plain copy
for key in ${!map[@]}  
do  
    echo ${map[$key]}  
done  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值