是否可以创建您自己可以使用的 ASCII 字符?如果是的话,会怎样做呢?
现在我的用例是这样的:假设我创建了角色#12345
,并且我正在为我制作的某些脚本生成一些自定义日志,并且我希望每个字段都由我的新角色分隔,例如:
ID #12345 Host #12345 User #12345 Message #12345 Timestamp
1 #12345 host1 #12345 user1 #12345 This user did this this and that #12345 11:11:11
2 #12345 host1 #12345 user2 #12345 This other user did this new thing #12345 11:11:51
所以我想要一个自定义字符的原因是因为我希望每个字段中的文本能够包含任何字符(并且它们不太可能具有我的自定义字符),然后我可以轻松地操纵它使用 awk withawk -F '#12345' '{print $4}'
来获取消息,无论消息中实际包含什么内容,我通常在 json 格式的输出中遇到问题,因为,
键值对之间存在 a ,而,
消息中也可能存在 a 。
它不是重复的,因为我的问题不是“如何解析 json”,这只是我的用例。我的问题是关于制作一个我可以使用的自定义角色。
答案1
对于您的具体问题,唯一可能的答案是“不。ASCII 字符是一组预定义的 7 位字符,其值介于 0-127 之间,并且为每个值分配了特定含义。没有范围可以添加到或改变它们”。
不过,我猜这不是你真正想问的问题。您想知道是否存在(或可以)保证可与任何输入数据一起使用的唯一分隔符。
一般来说,答案是否定的——这是不可能的,它不存在。
然而,在特定情况下(即具有已知或容易发现的特征的输入数据),通常可以找到一个不太可能或保证不可能在数据字段中找到的字符。
大多数人使用 TAB 作为“不可能出现在数据中”的分隔符。 :
也很流行(例如/etc/passwd),除非有时间字段或其他通常使用冒号的数据。并且逗号在很多情况下都是可用的。
有些人使用格式正确的 CSV(即和可能包含分隔符的字符串字段周围的引号)。其他人则使用 JSON 或 XML 或其他结构化文本格式。这些需要一个好的解析器来准确地从中提取数据。
理论上,你可以在 bash 中编写这样的解析器。在实践中,你真的不想 - 这比仅仅使用正确的工具来完成工作要多得多的工作......或正确的语言(用 C 或 perl 或 python 编写一个好的解析器比用缓慢且非常有限的语言,如 bash)
额外信息:在您的其他问题中,您似乎认为在 bash 脚本中使用“第三方工具”有问题。事实并非如此——这就是 shell 脚本的作用,充当多个第三方工具之间的“粘合剂”和“协调器”。这正是 sh/bash 所擅长的。
答案2
假设您指的是 UNICODE 而不是 ASCII,解决方案将涉及Unicode 字符数据库。
看看他们的常见问题解答中的“基本问题”,似乎您的目标可能是使用未分配的角色,这显然应该在“私人使用区域”内作为“一致的 Unicode 实现”。
欲了解更多信息(即被常见问题解答淹没)看看这里。
答案3
如图所示,解析日志文件似乎并不太困难没有建议的#12345
魔法分隔符。我会第一个指出这个建议不能满足”我希望每个字段中的文本都能够包含任何字符“但无论如何我都会根据主机名、用户名和时间戳来建议这一点大概没有空格。
cat log
ID Host User Message Timestamp
1 host1 user1 This user did this this and that 11:11:11
2 host1 user2 This other user did this new thing 11:11:51
while IFS=' ' read -r id host user message
do
timestamp="${message##* }" message="${message% *}"
printf "%s - %s - %s - %s - %s\n" "$id" "$host" "$user" "$message" "$timestamp"
done <log
ID - Host - User - Message - Timestamp
1 - host1 - user1 - This user did this this and that - 11:11:11
2 - host1 - user2 - This other user did this new thing - 11:11:51