shell题

随机数

随机产生 a-z 10 位小写字符串

head /dev/urandom | tr -dc a-z | head -c 10
head /dev/urandom | tr -dc a-z | tr -d s-w | head -c 10    # 排除s-w字符串

随机产生 0-9 10 位数字

head /dev/urandom | tr -dc 0-9 | head -c 10
head /dev/urandom | tr -dc 0-9 | tr -d 4,5 | head -c 10   # 排除4和5

随机产生数字,字母大小写 20位字符串

head /dev/urandom | tr -cd a-zA-Z0-9 | head -c 20

创建10个指定文件名例如 [hnzlorcbhm_data.html]要求前十位为随机小写加指定后缀[_data.html]

for i in {1..10};do 
    touch $(head /dev/urandom | tr -dc a-z | tr -d s-w | head -c 10)_data.html
done

统计文件中单词,字母

统计字符串中出现的单词,字母

str="the squid project provides a number of resources toassist users design,implement and support squid installations. \
Please browsethe documentation and support sections for more infomation"

按单词出现的频率降序排序

echo $str|sed 's#[^a-zA-Z]#\n#g'|grep -v "^$"|sort|uniq -c|sort -rn -k1
echo $str|tr ' ' '\n'|sort|uniq -c|sort -rn -k1

按字母出现的频率降序排序

echo $str|grep -o "."|egrep -v "[^a-zA-Z]"|sort|uniq -c|sort -rn -k1
echo $str|sed -r 's#(.)#\1\n#g'|egrep -v "[^a-zA-Z]|^$"|sort|uniq -c|sort -rn -k1

日期

打印指定年份

date '+%Y%m%d' -d '+10 year'       # 10年后日期
date '+%Y%m%d' -d '-10 year'       # 10年前日期

打印指定月之后的日期

date '+%Y%m%d' -d '+1 month'        # 1个月后日期
date '+%Y%m%d' -d '-1 month'        # 1个月前日期

打印指定天的日期

date '+%Y%m%d' -d '+10 day'        # 10 天后日期
date '+%Y%m%d' -d '-10 day'        # 10 天前日期

打印指定小时时间

date '+%H%M%S' -d '+2 hour'        # 2小时后时间
date '+%H%M%S' -d '-2 hour'        # 2小时前时间

打印指定分时间

date '+%H%M%S' -d '+5 minute'      # 5分钟后的时间
date '+%H%M%S' -d '-5 minute'      # 5分钟前的时间

打印指定日期

打印出 15 天前到当前 的日期(从0开始包含当前日期)

for i in {0..15}; do
    date -d "+$i day $(date +%Y%m%d)" +%Y%m%d
done

打印出当前时间到 15 天后的时间

for i in {0..15}; do
    date -d "+$i day $(date +%Y%m%d)" +%Y%m%d
done

打印 20180101 之后的 15 天

for i in {0..15}; do
    date -d "+$i day 20180101" +%Y%m%d
done

打印 20180101 之前的 15 天

for i in {0..15}; do
    date -d "-$i day 20180101" +%Y%m%d
done

计算某年有多少天(已知每年最后一天为 12/31 %j 获取当前时间是一年中的第几天)

date -d "20001231" +%j

将指定日期时间转换为 unix 时间戳

date -d '20180727 23:51:00' +%s

将指定 unix 时间戳转换为日期时间格式

date -d '@1532706660' +'%Y-%m-%d %H:%M:%S'
date -d '@1532706660' +%Y                    # 获取时间戳年份
date -d '@1532706660' +%m                    # 获取时间戳月份
date -d '@1532706660' +%w                    # 获取时间戳当天礼拜几
date -d '@1532706660' +%j                    # 获取时间戳是当年的第几天

写一个脚本计算某个日期到当前有多少天

cat <<'EOF'  >./sum_day.sh
#!/bin/bash

s_Y=$(date -d "$1" +%Y)                     # 获取输入的年份
e_Y=$(date +%Y)                             # 获取当前年份
s_j=$(date -d "$1" +%j | sed 's/^0//')      # 取出输入的日期是当年的第几天(若不满100去除首部的0)
e_j=$(date +%j | sed 's/^0//')              # 获取当前日期是今年的第几天
a=$s_Y

# for 循环方式
for ((a=$s_Y; a<=$e_Y; a++ ));do
    let sum=$sum+$(date -d ${a}1231 +%j)    # 累加输入的年份到当前年份天数(已知每年最后一天为 1231 +%j 获取每年的天数)
    echo $a -----  $(date -d ${a}1231 +%j)   ------ $sum
done

# while 循环方式
#while ((a<=$e_Y)); do
#    let sum=$sum+$(date -d ${a}1231 +%j)
#    echo $a -----  $(date -d ${a}1231 +%j)   ------ $sum
#    let a++ ;
#done

let e_d=$(date -d ${s_Y}1231 +%j)-$e_j      # 获取今年剩余天数
echo  "从 ${s_Y}0101 到 ${e_Y}1231 一共有 $sum 天"
echo  "输入的日期在当年是第: $s_j 天"
echo  "今年剩余: $e_d  天"
let sum=$sum-$s_j-$e_d                      # 用累加天数减 输入日期当年的天数 减去 今年剩余天数
echo "从 $1 到今天 $(date +%Y%m%d) 一共有 $sum 天"
EOF

# 使用方法
sh ./sum_day.sh 19910119

# 测试结果
date -d "-10052 day $(date +%Y%m%d)" +%Y%m%d        # 请替换10052 为上面计算出来的值