急!!求助高手:linux脚本里面 字段之间的分隔符用16进制的0x1f如何实现?

baiying15 2012-06-11 04:40:50
就是我写了一个shell脚本,用来定时的输出一些记录,都存放在一个文本里面,字段之间的分隔符要用16进制的0x1F来分割,这个要怎么实现呢?如:这是一条要输出的记录:

18381466618|Samsung GT-S5368|20120610013635|41| |2378|

现在的分隔符是 | 实际上是要用16进制的0x1F来分割,请问要怎么写这个shell脚本?

'{print $2 "|" $3 "|" $5 "|" 10 "|" " " "|" $4 "|" " "}'(这是我写的用|分割,怎么把| 换成16进制的0x1F来分割呢?)

跪求高手解答,无限感谢。。。
...全文
804 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
baiying15 2012-06-13
  • 打赏
  • 举报
回复
我这样改了一下:
cat test.log |awk -F"[,\t= ]" '{printf $1" "$2"|""GetUserServicesEvt""|";if(test invokeTime){for(i=3;i<=NF;i++){if($i=="invokeTime")printf "%s",$(i+1)"|"}};if(test returnCode){for(i=3;i<=NF;i++){if($i=="returnCode")printf "%s",$(i+1)"|"}};printf "\n"}'

测试结果不对,肯定是我的if判断没弄对,请教高手指导。。。万分感谢!
baiying15 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 7 楼 的回复:

在请教高手一个问题:linux 如何判断一条记录里面是否存在某个字符串? 是一条记录里面哈,不是一整个文本里面,我知道好像可以用grep来实现,但是这不是我想要的,我的目的就是想判断,如果这条记录里面存在这个字符串,就干嘛,不存在的话又干嘛。。


可以用[] 或者 test判断grep命令的返回值是否为空啊,if [ -z `grep keyword fi……
[/Quote]

亲,请问用[]或者test怎么能实现我上面的那个语句呢?您写的这个if [ -z `grep keyword file` ]我没看懂。。惭愧。
baiying15 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

可以用grep

$ echo "abc"|grep "ab" 1>/dev/null && echo "yes" || echo "no"
yes
$ echo "abc"|grep "xx" 1>/dev/null && echo "yes" || echo "no"
no
[/Quote]
这里面的1>/dev/null是什么意思?能否讲解一下。

其实是这样的,这是我写的语句:
cat test.log |grep "INFO" |awk -F"[,\t= ]" '{printf $1" "$2"|""GetUserServicesEvt""|";for(i=3;i<=NF;i++){if($i=="invokeTime" || $i=="returnCode" || $i=="accessPlatformID"||$i=="MSISDN"|| $i=="description")printf "%s",$(i+1)"|"};printf "\n"}'

就是在每条记录里面取出if后面那几个字段,可是有的记录里面没有某个字段,而且这个语句打印出来的每个字段的顺序也可能不固定,所以我就想在for循环前面加个判断,就是记录里面如果有这个字段,就用for循环给找出来,如果没有就打印个空值,这样每个字段的位置就固定了。
qq120848369 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

在请教高手一个问题:linux 如何判断一条记录里面是否存在某个字符串? 是一条记录里面哈,不是一整个文本里面,我知道好像可以用grep来实现,但是这不是我想要的,我的目的就是想判断,如果这条记录里面存在这个字符串,就干嘛,不存在的话又干嘛。。
[/Quote]

可以用[] 或者 test判断grep命令的返回值是否为空啊,if [ -z `grep keyword file` ]
justkk 2012-06-12
  • 打赏
  • 举报
回复
可以用grep

$ echo "abc"|grep "ab" 1>/dev/null && echo "yes" || echo "no"
yes
$ echo "abc"|grep "xx" 1>/dev/null && echo "yes" || echo "no"
no
baiying15 2012-06-12
  • 打赏
  • 举报
回复
在请教高手一个问题:linux 如何判断一条记录里面是否存在某个字符串? 是一条记录里面哈,不是一整个文本里面,我知道好像可以用grep来实现,但是这不是我想要的,我的目的就是想判断,如果这条记录里面存在这个字符串,就干嘛,不存在的话又干嘛。。
baiying15 2012-06-12
  • 打赏
  • 举报
回复
非常感谢楼上的俩位,我用的是{printf("%c",31)}来实现的。跟你们写的基本一样,感谢哈
justkk 2012-06-11
  • 打赏
  • 举报
回复
在awk里面,直接使用printf呢

awk 'BEGIN{printf("%c", 0x1F);}'
qq120848369 2012-06-11
  • 打赏
  • 举报
回复
[User:root Time:17:24:04 Path:/home/liangdong/shell]$ echo "18381466618|Samsung GT-S5368|20120610013635|41|" > b   
[User:root Time:17:24:12 Path:/home/liangdong/shell]$ ll
total 12
-rw-r--r--. 1 root root 48 Jun 11 17:23 a
-rw-r--r--. 1 root root 48 Jun 11 17:24 b
-rw-r--r--. 1 liangdong liangdong 0 May 28 20:21 b044831.dat
-rw-r--r--. 1 liangdong liangdong 0 May 28 20:21 b044832.dat
-rw-r--r--. 1 liangdong liangdong 0 May 28 20:21 b044833.dat
-rwxr--r--. 1 liangdong liangdong 155 Jun 11 17:23 test.sh
[User:root Time:17:24:13 Path:/home/liangdong/shell]$ cat a
18381466618Samsung GT-S53682012061001363541
[User:root Time:17:24:16 Path:/home/liangdong/shell]$ cat b
18381466618|Samsung GT-S5368|20120610013635|41|
[User:root Time:17:24:17 Path:/home/liangdong/shell]$ cat test.sh
#!/bin/bash

echo "18381466618|Samsung GT-S5368|20120610013635|41|" |
awk -F '|' '{
sep = sprintf("%c", 0x1F);
gsub(/\|/, sep, $0);
print $0;
}'
[User:root Time:17:24:22 Path:/home/liangdong/shell]$

[User:root Time:17:24:51 Path:/home/liangdong/shell]$ cat a | od -c
0000000 1 8 3 8 1 4 6 6 6 1 8 037 S a m s
0000020 u n g G T - S 5 3 6 8 037 2 0 1
0000040 2 0 6 1 0 0 1 3 6 3 5 037 4 1 037 \n
0000060

给你测试过了,是正确的。
qq120848369 2012-06-11
  • 打赏
  • 举报
回复
awk 'BEGIN{print sprintf("%c", 0x1F);}'

这样也可以
qq120848369 2012-06-11
  • 打赏
  • 举报
回复
$sep=`echo 'ibase=16;obase=2;0x1F' | bc`
echo 记录 | tr '|' $sep

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧