I want to remove last character from a line:
[root@ozzesh ~]#df -h | awk '{ print $5 }'
Use%
22%
1%
1%
59%
51%
63%
5%
Expected result:
Use
22
1
1
59
51
63
5I want to remove last character from a line:
[root@ozzesh ~]#df -h | awk '{ print $5 }'
Use%
22%
1%
1%
59%
51%
63%
5%
Expected result:
Use
22
1
1
59
51
63
5sed 's/.$//'
To remove the last character.
But in this specific case, you could also do:
df -P | awk 'NR > 1 {print $5+0}'
With the arithmetic expression ($5+0) we force awk to interpret the 5th field as a number, and anything after the number will be ignored.
Note that GNU df (your -h is already a GNU extension, though not needed here) can also be told to only output the disk usage percentage:
df --output=pcent | tail -n +2 | tr -cd '0-9\n'
(tail skips the headers and tr removes everything but the digits and the line delimiters).
On Linux, see also:
findmnt -no USE%
With sed, this is pretty easy:
$ cat file
Use%
22%
1%
1%
59%
51%
63%
5%
$ sed 's/.$//' file
Use
22
1
1
59
51
63
5
The syntax is s(ubstitute)/search/replacestring/. The . indicates any character, and the $ the end of the line. So .$ will remove the last character only.
In this case, your complete command would look:
df -h | awk '{ print $5}' | sed 's/.$//'
I have two solutions :
cut: echo "somestring1" | rev | cut -c 2- | rev
Here you reverse the string and cut the string from 2nd character and reverse again.
sed : echo "somestring1" | sed 's/.$//'
Here you will search for regular expression .$ which means any characters followed by a last character and replace it with null // (between the two slashes)
In awk, you could do one of
awk '{sub(/%$/,"",$5); print $5}'
awk '{print substr($5, 1, length($5)-1)}'
Did you know that head and tail can work on a character basis instead of per line?
$ printf "I don't like periods." | head -c-1
I don't like periods
(BTW, printf is used here to prevent printing the "new line" character at the end of the line. If your output has a new line character and you want to remove that as well as the last non-whitespace character, use head -c-2).
This is basically the same as "Guru"'s solution using cut, but without the funky rev back and forth that they need to use because cut has no syntax for "last n things".
To iterate over a stream of lines and remove the last character of each, one might do something like this:
some-command | while read line; do echo $(head -c-2 <<<"$line"); done
df -h | awk 'NR > 1{ print $5 }' | cut -d "%" -f1
echo "123" | perl -ple 'chop'
12
another approach:
mapfile -t list < <(df -h)
printf '%s\n' "${list[@]%?}"
Turn it into a function:
remove_last() {
local char=${1:-?}; shift
mapfile -t list < <("$@")
printf '%s\n' "${list[@]%$char}"
}
Then call it like this:
remove_last '%' df -h
mapfile is a bash4 feature.
The catch here is that you must supply a character to remove; if you want it to just be whatever the last character happens to be then you must pass '?' or ''. quotes required.
Try with this:
df -h | awk '{ print $5 }' | sed "s/%//"
The normal use is: (ie)
VALUE=987654321
echo X123456789X | sed "s/123456789/${VALUE}/"
Response should be: X987654321X
sed -ie '$d' filename
here -i is to write changes
e means expression
$ means last line
d means delete
Note:Without -e option $ wont work
Optional: To delete 1st and last line use sed -ie '1d;$d' filename