怎么使%MEM是普通字符
时间: 2024-03-18 07:41:20 浏览: 48
如果你想在while循环中保留"%MEM"作为普通字符,你可以使用IFS(Internal Field Separator)变量来改变分隔符。默认情况下,IFS包含空格、制表符和换行符,用于将输入行分解为单词。你可以将IFS设置为一个不常见的字符来避免字符串被分解。比如,你可以将IFS设置为"#",然后在awk命令中使用"#"作为字段分隔符,这样就可以将"%MEM"作为一个整体保留下来了。修改后的代码如下:
```bash
#!/bin/bash
sum=0
IFS='#' # 将IFS设置为#符号
while read line
do
mem=$(echo $line | awk -F'#' '{print $4}') # 使用#作为字段分隔符
sum=$(echo "$mem+$sum" | bc)
done < nowcoder.txt
echo $sum
exit 0
```
这个脚本中,我们将IFS设置为"#",然后在while循环中使用read命令读取输入行。由于IFS被设置为"#",read命令会将整行作为一个单词读入到变量line中。在awk命令中,我们使用-F选项将字段分隔符设置为"#",然后提取第四个字段(即"%MEM"所在的字段),并将其加入sum中。最后,我们将IFS重置为默认值,以免影响后续命令的执行。
相关问题
linux中__iomem类型怎么打印
`__iomem` 是Linux内核中用于描述内存映射I/O区域(Memory-Mapped I/O, MMIO)的一种特殊数据类型。这种类型的内存可以直接通过硬件访问,常用于设备驱动程序中处理硬件寄存器。
在Linux系统中,如果你有一个`__iomem` 类型的指针,并想要将其内容打印出来,通常不会直接像打印普通`char*`那样操作,因为`__iomem`地址往往关联着特定的硬件地址,而不是ASCII字符。但是,你可以通过读取这个地址对应的字节并转成十六进制或者其他形式来显示。
下面是一个简单的示例:
```c
#include <linux/iommu.h> // 引入包含 __iomem 的头文件
void print_iomem(__iomem *iomem_addr) {
const int bytes_to_read = 16; // 想要打印的字节数
char buffer[bytes_to_read];
for (int i = 0; i < bytes_to_read; ++i) {
buffer[i] = ((unsigned char *)iomem_addr)[i]; // 读取字节
}
printf("ioread from %p: ", (void*)iomem_addr);
for (int i = 0; i < bytes_to_read; ++i) {
printf("%02x ", buffer[i]); // 打印十六进制
}
printf("\n");
}
// 使用时,传入你需要打印的 __iomem 地址
print_iomem(your_iomem_variable);
```
注意,在实际应用中,你可能需要根据具体的硬件结构和协议解析这些字节的意义,而不是简单地当作内存字节看。
阅读全文